- 247 名前:デフォルトの名無しさん mailto:sage [2014/12/14(日) 23:34:55.92 ID:lkA9lgpO.net]
- >>234
>Rubyには「他言語の関数」に相当するものがなく、...... これは(>>240 に書いたけど)、まったくそのとおり >でもRubyのブロックはファーストクラスとは言い難い。 ここの「....とは言い難い」という文章表現は曖昧だね (なぜ「....ではない」と断定的に言い切れなかったのだろうか?) まず >>240 で書いたように、Ruby の「ブロック付きメソッド呼び出し」は構文糖だ (対して、簡潔な構文を追求した Smalltalk では、常にブロックはオブジェクトである) これを構文糖にした理由の一つはメソッド呼び出しコードを簡潔にする目的(>>240)であるが、 ブロックを多用する Ruby のプログラミングスタイルでは、ブロックを評価するたびに Procオブジェクトを生成していたのでは実行効率の面でオーバヘッドが大きいという理由がある このためRubyインタプリタの内部だと、 ブロックは(重いオブジェクトを表すC構造体ではなく)専用の軽量なC構造体で表現されている ただし、(たとえ内部表現が Proc オブジェクトと異なっていても)プログラマから見れば問題にならない なぜなら、渡されたブロックをいつでも Proc オブジェクトへ変換できる構文糖が最初から用意されているから.... たとえば foo(x, y) { |z| .... } という「ブロック付きメソッド呼び出し」に対して(>>240): ・def foo(x, y); .... ; end ・def foo(x, y, &block); .... ; end という2つのメソッド定義は「いつでも」交換できる まとめると: Ruby のブロックは内部表現だと Proc オブジェクトではないが、 プログラマ目線ではファーストクラスのオブジェクトとして扱うことができる
|

|