Rubyで複素数クラスを定義する

4月25日にRuby/Rails勉強会@関西があるので、Rubyの復習をしてる。今回はクラスを使う練習として、複素数クラスを作ってみることにした。

基本的なクラス定義はこんな感じ。

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

# 複素数クラス
class Complex
  def initialize(re, im)
    @real = re
    @image = im
  end

  def to_s
    "%d + %di" % [@real, @image]
  end

  def abs
    Math.sqrt(@real ** 2 + @image ** 2)
  end
end

# 複素数クラスを使う
z = Complex.new(3, 4)
puts "z = " + z.to_s
puts "|z| = %f" % z.abs

initialize(コンストラクタ)、クラスメソッドを定義した。実行してみる。

z = 3 + 4i
|z| = 5.000000

とりあえずできてる。

もうちょっと凝ったこともやってみよう。

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

# 複素数クラス
class Complex
  # この辺はいっしょ
  def initialize(re, im)
    @real = re
    @image = im
  end

  def to_s
    "%d + %di" % [@real, @image]
  end

  def abs
    Math.sqrt(@real ** 2 + @image ** 2)
  end

  # ここから追加
  # クラス定数を定義する
  I = self.new(0, 1)

  # 属性メソッドを定義する
  attr_accessor :real, :image
end

z = Complex.new(3, 4)
puts "z = %d + %di" % [z.real, z.image]
puts "|z| = %f" % z.abs

# 値を変更する
z.real = 5
z.image = 12
puts "z = %d + %di" % [z.real, z.image]
puts "|z| = %f" % z.abs

# クラス定数を使用する
puts "I = " + Complex::I.to_s
puts "|I| = %f" % Complex::I.abs

結果はこんな感じ。

z = 3 + 4i
|z| = 5.000000

# 値を変更する
z = 5 + 12i
|z| = 13.000000

# クラス定数を使用する
I = 0 + 1i
|I| = 1.000000

うむっ。

あと、リファレンスをriコマンドで調べてたら、zshで補完できることに気がついた。zsh++。