# Rubyでは、すべてがオブジェクト。じゃないよ!
_published: 2010/04/07_ 
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を調べてみると面白いかもしれません。