n = 5
def num
puts n
end
为什么是错的的?
我知道全局和局部基本原理。
局部变量在函数里只能使用,在外部是不存在。
但是在python或js里使用这样方式可以执行的!
还是只有ruby要在函数使用变量需要重新宣告。
请问各位可以解释吗?
谢谢
迷茫2017-04-22 09:01:49
하지만 Python이나 js에서는 이런 방식으로 실행될 수 있습니다!
Python에서는 읽기 전용
다음은 루비가 왜 이런 짓을 했는지에 대한 추측입니다.
Ruby에서 def
생성된 메서드는 전역 변수에만 액세스할 수 있습니다. define_method
에 의해 생성된 메서드와 -> (param) {}
또는 lambda { |param| }
에 의해 생성된 proc에는 클로저가 있으며 외부 변수에 액세스할 수 있습니다.
Ruby가 가장 일반적인 상황은 외부 변수에 접근할 필요가 없다고 생각하기 때문인 것 같습니다. 그래서 def
에서는 접근 권한을 주지 않습니다.
function
헤더에서 정의하지 않아야 하는데 이는 매우 장황합니다. 클로저가 있는 람다의 경우 클로저 없이 람다를 사용해도 괜찮나요?
define_method
는
define_method
소위 메타프로그래밍이기 때문에 외부 변수를 사용할 확률이 더 높습니다. (원래 메타프로그래밍을 사용한다는 것은 게으르고 입력이 적다는 것을 의미합니다. 외부 변수를 사용할 수 없고 매개 변수로 전달해야 하는 경우, 지칠 것입니다.) 그래서 마무리합니다. define_method
에 클로저를 포함하도록 하세요. define_method
define_method (symbol) { |param| }
외에 define_method(symbol, method)
로 쓸 수도 있습니다. 그 중 method
자체에 람다를 전달하는 경우가 더 일반적입니다. 폐쇄하면 매우 일관성이 없으므로 그대로 두십시오. define_method
伊谢尔伦2017-04-22 09:01:49
@Andrew_375683님 말씀이 맞습니다.
주로 범위의 문제
하지만 이를 해결하는 간단한 방법이 있습니다. n을 함수
巴扎黑2017-04-22 09:01:49
핫한 질문입니다. 방금 거기에 갔는데 내가 돌아 왔을 때 몇 사람이 대답했습니다.
코드의 n이 전역 변수라고 생각하지만 안타깝게도 그렇지 않습니다
으아악수정이 필요한 경우 접두사로 $를 추가하세요.
으아악아름다운 루비 스타일에 $가 너무 눈길을 사로잡네요. Ruby 상사는 전역 변수가 필수라는 것을 알고 있지만 남용을 두려워하여 약간의 트릭을 사용합니다.) 루비 변수 범위에 대한 지식이 필요합니다. 루비의 장점은 복잡하고 독특합니다.
@andrewzhyl이 좋은 말을 하더군요. 좋아요.
高洛峰2017-04-22 09:01:49
참고하세요: def와 def_method의 차이점: def는 메서드를 정의하는 데 사용되는 키워드입니다. def_method는 메서드이고 해당 기능은 새 메서드를 생성하는 것입니다. def의 코드는 컨텍스트에서 완전히 격리됩니다. @ Variables with Meida) 및 Define_method가 있는 코드는 더 개방적이며 수정 없이 친구를 만날 의향이 있습니다.