Ruby の第一級関数としての Proc


たまたま上のブログ記事を読んでいて、次のような記述があった。

引数のない関数呼び出しに括弧がいらない、かつ関数がファーストクラスの言語では、逆に「その関数自体」を意味する式をつくるために新しい文法が必要になる。

たとえばPythonでこう書けるところを:

>>> def foo():
...     print "foo!"
... 
>>> bar = foo
>>> bar()
foo!

Rubyではこう書く事になる

>> def foo
>>   p "foo!"
>> end
=> nil
>> bar = Object.method(:foo)
=> #<Method: Class(Object)#foo>
>> bar.call
"foo!"
=> nil

というものである。これを見ると Ruby のメソッドをファーストクラスとして扱うのは面倒なのだなあと思われるかも知れない。(これは推奨されない手法ということで、わざと面倒にしてあるらしい。)

しかしそのような目的には Ruby では Proc(あるいは lambda)を使うことができる。

>> foo = proc do
>>   puts "foo!"
>> end
=> #<Proc:0x00557f7d142470>
>> bar = foo
=> #<Proc:0x00557f7d142470>
>> bar.()
foo!
=> nil

これが Python と殆ど同様なのは明らかであろう。

Ruby では「関数」というのはむしろ Proc なのであり、メソッドというのはすべてインスタンス・メソッドと見做されている。トップレベルのメソッドまたそうであり、見かけ上のインスタンス(乃至はオブジェクト)main に対するインスタンス・メソッドなのである。ちなみにこのオブジェクト main は、明示的に使うことはできない。


参考:
Ruby の lambda は第一級オブジェクト(だと思う) - Camera Obscura