Hatena::ブログ(Diary)

このブログは証明できない。

2010-04-07

[]Rubyでは、すべてがオブジェクト。じゃないよ!

Rubyでは、すべてがオブジェクト。と説明される場合があります。確かに、「1」も「+」もクラス自体もすべてオブジェクトです。ですが、「ほぼ」すべてがオブジェクトであって、すべてではないんです。


修正(2010-04-30):

Rubyでは、メソッドはオブジェクトではありません。トラックバックで教えていただきました。また、まつもとさんも「メソッドはオブジェクトではない」と発言しています。メソッドを「オブジェクト化」することは可能です。ちなみに、Pythonの場合は、メソッドもオブジェクトだそうです。




例をひとつ。ブロックはオブジェクトではありません。

ary.each {|x| puts x}

と書けますが、

block = {|x| puts x}

とは書けません。




以前、このような記事を書きました。


そのなかで、

blockとProcの唯一の違いは、blockは保存できないということです。

と書いているのですが、それに対してトラックバックをいただきました。


def ref(&block)
  block
end

a = ref {
  puts "ok!"
}

a.call # ok!
puts a.class # Proc class

とすると、ブロックを保存できるということです。


しかし、この場合、blockはブロックではなく、Procオブジェクトなのです。&blockがブロックだと考えるといいかもしれません。次のコードを見てみましょう。Procオブジェクトを作ります。

pr = Proc.new {|x| puts x}

Procオブジェクトは、ブロックの代わりにはなりません。

ary.each pr

このコードはエラーになります。そこで、&を付けます。

ary.each &pr

これで、eachメソッドを呼び出すことができます。ブロックとProcオブジェクトの違いがわかりますね。




このように、ブロックはオブジェクトではありません。他にRubyでもオブジェクトでないものに、「and」や「or」、「&&」や「||」などがあります。演算子が特別なのは当たり前だろと思う人は、LISPを調べてみると面白いかもしれません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証