2010-12-30 2 views
3

Rubyローカル変数をメソッドからサブメソッドに渡すにはどうすればよいですか?この単純なRubyのコードが与えられ

def testMethod 
    testVar = 1 
    def subTestMethod 
    if testVar == 1 
     puts 'Yes' 
    else 
     puts 'No' 
    end 
    end 
    subTestMethod 
end 

testMethod 

はクラス変数を使用することを余儀なくされることなく、サブメソッドにローカルtestVar変数を渡す方法はありますか? subTestMethod

def testMethod 
    testVar = 1 
    def subTestMethod(testVar) 
    if testVar == 1 
     puts 'Yes' 
    else 
     puts 'No' 
    end 
    end 
    subTestMethod testVar 
end 

答えて

8

のパラメータとして

+0

お役立ち情報ありがとうございました。 – mybuddymichael

1

パスtestVarは、あなたが持っているコードを、非常に可能性の高いあなたがやりたいことはありませんすることは:

あなたのコード内のインナーdefローカルメソッドを定義していません。 。代わりにが初めて呼び出されると、ObjectクラスのグローバルメソッドとしてsubTextMethodが定義されます。つまり、testMethodを呼び出すと、どこからでもsubTestMethodを呼び出すことができます。

subTestMethodtestMethodにローカルでないということはもちろん、subTestMethodtestMethodのローカル変数で閉じることもできないことを意味します。

したい動作を取得するには(あなたが任意のネストされた関数を必要としないようにしたり、デザインを再考)、あなたはこのようなラムダを使用することがあります:Rubyで

def testMethod 
    testVar = 1 
    subTestLambda = lambda do 
    if testVar == 1 
     puts 'Yes' 
    else 
     puts 'No' 
    end 
    end 
    subTestLambda.call 
end 
+0

これは、マイクが望む動作をしない可能性が非常に高いことに注意してください。これは、 '' global 'メソッドとして 'subTestMethod'を定義し、pythonのようにローカル関数として定義しないためです。 – sepp2k

+0

はい 'def'は新しいメソッド' subTestMethod'を定義します。これは 'testMethod'のように呼び出すことができます。 –

5

、ブロックのみ(ラムダリテラル)はクロージャーとすることができます。だから、あなたはメソッドを定義するためにブロックを使用する必要があります:他の人がすでに、これはあなたがそれはあなたがそれを考えるもの正確にはもちろん依存しない何を考えていたか否か、指摘したように

def testMethod 
    testVar = 1 
    Object.send(:define_method, :subTestMethod) do 
    if testVar == 1 
     puts 'Yes' 
    else 
     puts 'No' 
    end 
    end 
    subTestMethod 
end 

testMethod 

そうですが、おそらくではありません。

メソッドと(定数ではない)変数は、snake_case命名規則に従います。空の行を使用して、実際の作業と戻り値から初期化を分離し、すべてが式です。

だから、あなたのtestMethodsubTestMethodtestVarはむしろtest_methodsub_test_methodtest_var名前を付ける必要があります。 define_methodの前に、そしてsub_test_methodの前に空の行があるはずです。

def test_method 
    test_var = 1 

    Object.send(:define_method, :sub_test_method) do 
    puts(if test_var == 1 then 'Yes' else 'No' end) 
    end 

    sub_test_method 
end 

test_method 

あなたは、おそらくかなり欲しいのラムダです:

def test_method 
    test_var = 1 

    sub_test_lambda = -> { puts(if test_var == 1 then 'Yes' else 'No' end) } 

    sub_test_lambda.() 
end 

test_method 
うまく表現であるため、その値を返し、以来、そして、あなたは、if表現のputs外を引くことができます
関連する問題