>  Q&A  >  본문

ruby -- 全局和局部问题

n = 5
def num
  puts n
end

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

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

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

黄舟黄舟2761일 전751

모든 응답(6)나는 대답할 것이다

  • 黄舟

    黄舟2017-04-22 09:01:49

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

    으아악

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

    으아악

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-22 09:01:49

    으아악

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

    회신하다
    0
  • 迷茫

    迷茫2017-04-22 09:01:49

    하지만 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
    • 회신하다
      0
  • 伊谢尔伦

    伊谢尔伦2017-04-22 09:01:49

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

    로 바꾸세요. 으아악

    회신하다
    0
  • 巴扎黑

    巴扎黑2017-04-22 09:01:49

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

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

    으아악

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

    으아악

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

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

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-22 09:01:49

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

    회신하다
    0
  • 취소회신하다