2010-12-30 7 views

답변

8

당신이 코드에 매개 변수로

+0

잘 알고 있습니다. 고맙습니다. – mybuddymichael

1

가 패스 testVar, 매우 가능성이 당신이 원하는 일을하지 않습니다

내부 def을 코드에서 하지 로컬 메소드를 정의 않습니다 . 대신 처음으로 testMethod이 호출 되 자마자 subTextMethodObject 클래스의 전역 메소드로 정의합니다. 즉, testMethod를 호출하면 어느 곳에서나 subTestMethod에 전화 할 수 있습니다.

subTestMethod이 물론 testMethod에 국한되지 않는다는 사실은 subTestMethodtestMethod의 로컬 변수를 닫을 수 없다는 것을 의미합니다.

원하는 동작을 얻으려면, 당신은 (당신이 중첩 된 기능이 필요하지 않도록하거나 디자인을 재고)이 같은 람다를 사용할 수 있습니다

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

마이클이 바라는 동작을하지는 않을 것입니다.'subTestMethod'를 "global"메쏘드로 정의하고 파이썬처럼 로컬 함수로 정의하지 않을 것입니다. – sepp2k

+0

예'def'는'testMethod'처럼 호출 될 수있는 새로운 메소드'subTestMethod'를 정의 할 것입니다. –

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 명명 규칙을 따르고 빈 줄을 사용하여 실제 작업과 반환 값에서 초기화를 분리하고 모든 것은 표현식입니다.

그래서, 당신은 testMethod, subTestMethodtestVar 오히려 test_method, sub_test_methodtest_var을 이름을 지정해야합니다. define_method 앞에는 sub_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 
: 당신이 아마 오히려 원하는 것은 람다가

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 

입니다 : 그리고 당신은 잘 표현이며, 따라서 그 값을 반환하기 때문에, if 식의 puts 외부를 당길 수

관련 문제