다음 정의로 정의되지 않은 메서드를 캡처하려고했습니다.
def method_missing m
puts "#{m} is missing"
end
다음과 같이 정의되지 않은 메서드를 작성하면 foo
다음 과 같이 캡처됩니다 method_missing
.
foo # => foo is missing
그러나와 같은 정의되지 않은 메서드를 작성할 때 다음으로 Foo
캡처되지 않습니다 method_missing
.
Foo # => NameError: Uninitialized constant Foo
상수에서 명확 해지면 캡처되는 것처럼 보입니다.
self.Foo # => Foo is missing
Foo() # => Foo is missing
Foo
첫 번째 경우에 왜 캡처되지 않습니까? 메서드가 지역 변수 사이에 모호 할 때으로 캡처 method_missing
되지만 상수 사이에 모호 할 때가 아닌 기능입니까? 그렇다면 이에 대한 문서가 있습니까? 아니면 버그입니까?
문제는 이것이 실제로 모호하지 않고 직관적이지 않다는 것입니다. Ruby의 문법에서 대문자로 시작하고 인수 목록이 뒤 따르지 않는 식별자는 항상 상수 조회로 구문 분석됩니다.
와 같은 메서드를 정의한 경우에도 동일한 오류가 발생 def Foo "You won't see this" end
합니다. 이 발생하면 Foo
, 그것은 여전히 상수를 찾기 위해 노력할 것이다 Foo
그 이름으로 정수를이 발견되지되었을 때 나가서 설명하자면 NameError를 던져. 대문자로 시작하는 메소드를 호출하려면 명시 적 수신자 (예 :) self.Foo
또는 인수 목록 (빈 항목 만있는 경우)을 포함해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다