object.object_id メソッドで、あるオブジェクトの一意な番号がとれる。
== と equal? は比較方法が違うので var1 == var2 と var1.equal?(var2) の結果は同じになるとは限らない。
object.class メソッドで、あるオブジェクトのクラスがわかる。
"string".class #=> String "string".class.class #=> Class "string".class.class.class #=> Class
クラスもオブジェクトらしい。 String クラスというものは Class クラスのオブジェクトなので "string".class.class #=> Class になるということか。 "string".class.class.class も Class になったのは・・・なんでだろう?
見慣れない文法?というかメソッドなのか?がいくつか出てきた。
"string" << "ify" #=> "stringify" # "string" + "ify" と同じ結果になる
class Foo < Bar # ... end
ri String などとするとリファレンスが引ける。 perldoc みたいなものか。でも String の部分にあたるものをろくに知らないのでまだ使いこなせなさそう。
文法については Perl と似ているし、以前少し勉強したこともあるし、1章の範囲内ではまだ戸惑うところはなさそう。 $strout とか $stderr というのが出てきたけど、なんでこれだけ $ が頭についてるんだろう。何かの慣習なのかな。 if else で条件部分をカッコで囲う必要がないのか。ずいぶんすっきりしてみえる。 then も不要らしい。
型変換メソッド to_i がでてきた。型変換っていうのは Perl ではあんまりやることがなかったので慣れるまでは戸惑いそう。
ブロック付きメソッド、イテレータなど、「Rubyの特徴」みたいなことが書いてあるページでよく目にした内容が出てきた。まぁなんか .each とか .map とかのうしろには do |i| ... end とかつけるもんなんだな、くらいに思っておく。
String#each_byte, String#each_line メソッドを試してみた。 each_byte は puts したら数字が出てきた。一文字ずつ出るのとは違うのか。 each_line のほうは予想通り一行ずつでてきた。
クラスはやはり Class というクラスのインスタンスであるらしい。なので String クラスも Fixnum クラスもひとつのオブジェクト。オブジェクトだからインスタンスメソッドをもっていたり親クラスを持ってたりする。こんなの書いてみた。親クラスが Class なものと Module なものがある。
Fixnum.ancestors.each do |ancestor| ancestor_class = ancestor.class ancestor_object_id = ancestor.object_id puts "#{ancestor} is child of #{ancestor_class} (#{ancestor_object_id})" end
Module って何?Classと違うものがあるのかな?と思ったがこれも Class クラスのインスタンスであることにかわりはないっぽい。
p Kernel.class #=> Module p Kernel.class.class #=> Class p Kernel.class.class.class #=> Class
特異メソッドというのがでてきた。クラスではなくてあるオブジェクトにだけはえてるメソッドのことらしい。メソッドを定義するのは def メソッド名 とやるようだ。特異メソッドの場合は def object.method で。これは do とかはつけないみたい。 do のあるなしは慣れるまで混乱しそうだな。
a, b = "str", "str" def a.greet puts "I am the object #{self.object_id}" end a.greet #=> I am the object 3462200 b.greet #=> NoMethodError: undefined method `greet' for "str":String
演算子の多態性。同じ << でも場所によって挙動が違う。そういうもんだと思っておく。