# Rubyでは、すべてがオブジェクト。じゃないよ! _published: 2010/04/07_ ![alt](http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/shunsuk/20100407/1270642620) Rubyでは、すべてがオブジェクト。と説明される場合があります。~~確かに、「1」も「+」もクラス自体もすべてオブジェクトです。~~ですが、「ほぼ」すべてがオブジェクトであって、すべてではないんです。 修正(2010-04-30): Rubyでは、メソッドはオブジェクトではありません。トラックバックで教えていただきました。また、まつもとさんも「メソッドはオブジェクトではない」と発言しています。メソッドを「オブジェクト化」することは可能です。ちなみに、Pythonの場合は、メソッドもオブジェクトだそうです。 例をひとつ。ブロックはオブジェクトではありません。 ```ruby ary.each {|x| puts x} ``` と書けますが、 ```ruby block = {|x| puts x} ``` とは書けません。 以前、このような記事を書きました。 - [[Rubyのblock、Proc、lambdaを理解する]] そのなかで、 `block` と `Proc` の唯一の違いは、 `block` は保存できないということです。 と書いているのですが、それに対してトラックバックをいただきました。 - [ruby:ブロックも保存出来るよーな: Script雑感](http://zombiebook.seesaa.net/article/144853754.html) ```ruby def ref(&block) block end a = ref { puts "ok!" } a.call # ok! puts a.class # Proc class ``` とすると、ブロックを保存できるということです。 しかし、この場合、 `block` はブロックではなく、 `Proc` オブジェクトなのです。 `&block` がブロックだと考えるといいかもしれません。次のコードを見てみましょう。 `Proc` オブジェクトを作ります。 ```ruby pr = Proc.new {|x| puts x} ``` `Proc` オブジェクトは、ブロックの代わりにはなりません。 ```ruby ary.each pr ``` このコードはエラーになります。そこで、 `&` を付けます。 ```ruby ary.each &pr ``` これで、 `each` メソッドを呼び出すことができます。ブロックと `Proc` オブジェクトの違いがわかりますね。 このように、ブロックはオブジェクトではありません。他にRubyでもオブジェクトでないものに、 `and` や `or` 、 `&&` や `||` などがあります。演算子が特別なのは当たり前だろと思う人は、LISPを調べてみると面白いかもしれません。