rubyの勉強本格始動 [クラス定義]

rubyの勉強を本格的に始めることにした。以下がよさそうだったんだけど、「言語編」と「ライブラリ編」に分かれていて、しかも両方とも約4000円なのです。たかー。

プログラミングRuby 第2版 言語編

プログラミングRuby 第2版 言語編

ということで、買うの断念。
なんかないかなーと思ってたら!思い出しました、オブジェクト倶楽部のML。rubyの連載があるんです。2005年01号から始まります。読者の想定がjavaな人になっているので、読みやすいです♪
http://www.objectclub.jp/ml-arch/magazine/

クラス定義

とりあえず第1回〜第5回までは読んだのでクラス定義についてまとめてみる。

こんなjavaクラスをrubyで書くとどうなるか。
Java

  public class User {
    private String name = "名無し";
    private int age;

    public User(name, age) {
      if (name != null) this.name = name;
      this.age = age;
    }

    public String getName() {
      return this.name;
    }

    public int getAge() {
      return age;
    }

    public String info() {
      return info("[", "]");
    }

    public String info(String decoStart, String decoEnd) {
      return getName() + decoStart + getAge() + decoEnd;
    }
  }

ruby

class User
  attr_reader :name, :age

  def initialize(age, name="名無し")
    @name = name;
    @age = age;
  end

  def info(deco_s="[", deco_e="]")
    name + deco_s + age.to_s + deco_e
  end
end

こんな感じです。Javaと比べてもらうと、rubyの方が何をしているか大体分かるのではないでしょうか。
goodなのは、getterを作るのに「attr_reader」で済むところ。他にsetterを作る時に使う「attr_writer」と、両方作る「attr_accessor」があります。プロパティが多いと、それだけ行数削減につながります。あと、引数に初期値が与えられるのもいいですね。これによってinfoの定義が1つ減った。
一方イマイチな点とか慣れない点などを少々。infoメソッドのところですが、ageを「to_s」メソッドを使って文字に変換しないといけないのはイマイチ。javajavascriptみたいに+の連結で自動的に文字列になって欲しかったな。ただ僕がやり方を分かってないだけかもしれないけど。あとreturn書かなくていいとかdef-endでまとまっているとか慣れないな。慣れないついででいうと、initializeやinfoの後のカッコはあっても無くてもいいみたいです。ruby界隈だとどっちが標準なのかな。javaな僕はちょっと気持ち悪い。

ちなみに呼び出しは以下のようにします。

  u = User.new(26)
  puts u.info

上で書いたカッコがいらないというのは、何も定義の時だけの話じゃないです。呼び出し時もOK。

  u = User.new 26, "hoge"
  puts u.info "(", ")"

やっぱ気持ち悪いっす。


■2008/3/12 追記

ageを「to_s」メソッドを使って文字に変換しないといけないのはイマイチ。

と書いたのですが、rubikitchさんがトラックバックで教えてくださいました!

name + deco_s + age.to_s + deco_e

"#{name}#{deco_s}#{age}#{deco_e}"

と式展開すればOK。
式展開は普通以下のように文字列と変数を組み合わせる時に使うと可読性があがる。

"私の名前は#{name}で、年齢は#{age}です。"