2012-02-01 8 views

答えて

11

これは、Rubyのメソッドがファーストクラスのオブジェクトではないからです(例えば、IOのように)。だからあなたが内部のメソッドを定義するとき、受信機は何ですか?おそらくメソッド自体、またはバインディングや何か、しかしRubyはオブジェクト指向の深さを持っていません。

とにかく、あなたの例で何が起こると予想されていたのですか?それは、ローカル変数を変更したいのですか?a?そうであれば、procはメソッドの代わりになります。

def test 
    a = "a is for apple" 
    inner_method = lambda do 
    a = "something" 
    end 

    a # => "a is for apple" 
    inner_method.call 
    a # => "something" 
end 

test 

functional.rbは、」プログラミングのこのスタイルのより贅沢な一例です。

lambda, proc, and Proc.new」は、Rubyのさまざまな種類のクロージャの内訳です。

+0

他にすべてのレキシカルスコープがある場合はちょうど外れているようです。 –

+5

「その他すべて」?ブロックを除いて、* nothing *はレキシカルスコープを持ちます。メソッド本体ではありません。クラスボディではありません。モジュール本体ではありません。スクリプト本体ではありません。 *ブロック*は、「不自由な」ものです。 –

+3

Scalaのメソッドはファーストクラスのオブジェクトではありませんが、内部のメソッドは周囲のメソッドの環境に近いものです。なぜなら、「内部メソッド」はその外部メソッドで閉じるのではなく、もっと簡単な理由があります。*内部メソッドではないからです。これはグローバルメソッドの定義です。 –

関連する問題