@kyanny's blog

My life. Opinions are my own.

1章 ようこそ、Rubyのある生活へ

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

演算子の多態性。同じ << でも場所によって挙動が違う。そういうもんだと思っておく。