ruby -- 全局和局部问题
黄舟
黄舟 2017-04-22 08:59:49
0
6
777
n = 5
def num
  puts n
end

为什么是错的的?
我知道全局和局部基本原理。
局部变量在函数里只能使用,在外部是不存在。

但是在python或js里使用这样方式可以执行的!
还是只有ruby要在函数使用变量需要重新宣告。

请问各位可以解释吗?
谢谢

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

모든 응답(6)
黄舟

def가 새로운 범위를 열었습니다

으아악

n에 접근하려면 평탄화 범위를 사용해야 합니다

으아악
大家讲道理

으아악

나도 초보자인데 다른 전문가들의 의견을 들어보자.

迷茫

하지만 Python이나 js에서는 이런 방식으로 실행될 수 있습니다!

Python에서는 읽기 전용


다음은 루비가 왜 이런 짓을 했는지에 대한 추측입니다.

Ruby에서 def 생성된 메서드는 전역 변수에만 액세스할 수 있습니다.
define_method에 의해 생성된 메서드와 -> (param) {} 또는 lambda { |param| }에 의해 생성된 proc에는 클로저가 있으며 외부 변수에 액세스할 수 있습니다.

Ruby가 가장 일반적인 상황은 외부 변수에 접근할 필요가 없다고 생각하기 때문인 것 같습니다. 그래서 def에서는 접근 권한을 주지 않습니다.

  • 본의 아니게 js와 같은 외부 변수를 건드리지 마세요. JavaScript에서 이를 방지하려면 본문에 사용되는 모든 변수를 function 헤더에서 정의하지 않아야 하는데 이는 매우 장황합니다.
  • 클로저를 생성할 필요가 없어 오버헤드가 절약됩니다.

클로저가 있는 람다의 경우 클로저 없이 람다를 사용해도 괜찮나요?

define_method

때문인 것 같아요.
  • define_method 소위 메타프로그래밍이기 때문에 외부 변수를 사용할 확률이 더 높습니다. (원래 메타프로그래밍을 사용한다는 것은 게으르고 입력이 적다는 것을 의미합니다. 외부 변수를 사용할 수 없고 매개 변수로 전달해야 하는 경우, 지칠 것입니다.) 그래서 마무리합니다.
  • 메서드 정의에 클로저를 포함할 수 없어 불편한 경우도 있지만 일반적으로 그럴 필요는 없으므로 긴 define_method에 클로저를 포함하도록 하세요.
  • define_method define_method (symbol) { |param| } 외에 define_method(symbol, method)로 쓸 수도 있습니다. 그 중 method 자체에 람다를 전달하는 경우가 더 일반적입니다. 폐쇄하면 매우 일관성이 없으므로 그대로 두십시오. define_method
伊谢尔伦

@Andrew_375683님 말씀이 맞습니다.
주로 범위의 문제
하지만 이를 해결하는 간단한 방법이 있습니다. n을 함수

로 바꾸세요. 으아악
巴扎黑

핫한 질문입니다. 방금 거기에 갔는데 내가 돌아 왔을 때 몇 사람이 대답했습니다.

코드의 n이 전역 변수라고 생각하지만 안타깝게도 그렇지 않습니다

으아악

수정이 ​​필요한 경우 접두사로 $를 추가하세요.

으아악

아름다운 루비 스타일에 $가 너무 눈길을 사로잡네요. Ruby 상사는 전역 변수가 필수라는 것을 알고 있지만 남용을 두려워하여 약간의 트릭을 사용합니다.) 루비 변수 범위에 대한 지식이 필요합니다. 루비의 장점은 복잡하고 독특합니다.

@andrewzhyl이 좋은 말을 하더군요. 좋아요.

小葫芦

참고하세요: def와 def_method의 차이점: def는 메서드를 정의하는 데 사용되는 키워드입니다. def_method는 메서드이고 해당 기능은 새 메서드를 생성하는 것입니다. def의 코드는 컨텍스트에서 완전히 격리됩니다. @ Variables with Meida) 및 Define_method가 있는 코드는 더 개방적이며 수정 없이 친구를 만날 의향이 있습니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿