rubyの勉強本格始動 [クラス定義]
rubyの勉強を本格的に始めることにした。以下がよさそうだったんだけど、「言語編」と「ライブラリ編」に分かれていて、しかも両方とも約4000円なのです。たかー。
- 作者: Dave Thomas,Chad Fowler,Andy Hunt,田和勝,まつもとゆきひろ
- 出版社/メーカー: オーム社
- 発売日: 2006/08/26
- メディア: 大型本
- 購入: 7人 クリック: 270回
- この商品を含むブログ (156件) を見る
ということで、買うの断念。
なんかないかなーと思ってたら!思い出しました、オブジェクト倶楽部の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」メソッドを使って文字に変換しないといけないのはイマイチ。javaやjavascriptみたいに+の連結で自動的に文字列になって欲しかったな。ただ僕がやり方を分かってないだけかもしれないけど。あと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}です。"