문제
루비가 클래스 이외의 클래스 액세스 방법을 암시 적으로 어떻게 허용합니까?
예시:
class Candy
def land
homer
end
end
def homer
puts "Hello"
end
Candy.new.land #Outputs Hello
해결책
"호머"메소드의 정의는 객체 클래스에 메소드를 추가하는 것입니다. 자유 함수를 정의하는 것이 아닙니다.
클래스 캔디는 암시 적으로 물체에서 상속되므로 객체의 메소드에 액세스 할 수 있습니다. "land"메소드에서 "호머"를 호출 할 때, 메소드 해상도는 현재 클래스에서 정의를 찾을 수없고 슈퍼 클래스로 이동하여 객체에 추가 한 메소드를 찾아 호출합니다.
다른 팁
무슨 일이 일어나는지 알아내는 간단한 방법
사탕 물체에서 사용되는 방법을 해결하기 위해 어떤 클래스/모듈을 검색합니까?
P CANDY.ANCESSTORS #=> [CANDY, OBJECT, 커널
Candy에는 Homer라는 방법이 있습니까?
p candy.instance_methods (false) .grep ( "호머") #=> [
p candy.private_instance_methods (false) .grep ( "호머") #=> [
OK Candy에는 '호머'라는 방법이 없습니다.
조회 체인의 다음은 다음과 같습니다 (1) => "Object"
객체는 "호머"라는 방법이 있습니까? p object.instance_methods (false) .grep ( "호머") #=> [
p object.private_instance_methods (false) .grep ( "호머") #=> [ "호머"
Candy는 조회 체인에 객체를 가지고있어 개인 인스턴스 방법 "호머"가 있으므로 메소드 해상도가 성공합니다.
그만큼 DEF 문 항상 클래스에서 메소드를 정의합니다 본인 정의의 시점에 있습니다
무엇인가요 본인 호머가 정의되기 직전에?
p self #=> Main Def Homer Puts "Hello"End
그렇다면 그 유형은 무엇입니까?
p self.class #=> 객체
그것 때문에 호머 끝납니다 물체
기술적으로, 정의 homer
메소드는 실제로 있습니다 Kernel
혼합 된 모듈 Object
, 켜져 있지 않습니다 Object
곧장. 그렇게 할 때 homer
로컬 변수 또는 정의 된 인스턴스 메소드가 아닙니다. Candy
, Ruby Method 상속 체인이 후속 조치를 취합니다. Object
그런 다음 혼합 된 것입니다 Kernel
모듈 과이 코드가 실행됩니다.
편집하다: 죄송합니다. 왜 이걸 생각했는지 모르겠습니다. 이 방법은 실제로 계속되어있는 것 같습니다 Object
. 그것이 실제로 실제로 차이를 만들지는 모르겠지만 게시하기 전에 확인해야합니다.
루비에는 자유 플로팅 기능이 없습니다. 모든 방법은 일부 객체에 속합니다. 당신이하는 방법 def
최상위 수준에서 실제로 클래스의 인스턴스 방법이됩니다. Object
. 모든 것이 an이기 때문입니다 Object
어느 수준에서, 모든 객체는 액세스 할 수 있습니다 Object
인스턴스 방법.