문제

루비가 클래스 이외의 클래스 액세스 방법을 암시 적으로 어떻게 허용합니까?

예시:

class Candy
    def land
        homer
    end
end

def homer
    puts "Hello"
end

Candy.new.land #Outputs Hello
도움이 되었습니까?

해결책

"호머"메소드의 정의는 객체 클래스에 메소드를 추가하는 것입니다. 자유 함수를 정의하는 것이 아닙니다.

클래스 캔디는 암시 적으로 물체에서 상속되므로 객체의 메소드에 액세스 할 수 있습니다. "land"메소드에서 "호머"를 호출 할 때, 메소드 해상도는 현재 클래스에서 정의를 찾을 수없고 슈퍼 클래스로 이동하여 객체에 추가 한 메소드를 찾아 호출합니다.

다른 팁

무슨 일이 일어나는지 알아내는 간단한 방법

  1. 사탕 물체에서 사용되는 방법을 해결하기 위해 어떤 클래스/모듈을 검색합니까?

    P CANDY.ANCESSTORS #=> [CANDY, OBJECT, 커널

  2. Candy에는 Homer라는 방법이 있습니까?

    p candy.instance_methods (false) .grep ( "호머") #=> [

    p candy.private_instance_methods (false) .grep ( "호머") #=> [

  3. OK Candy에는 '호머'라는 방법이 없습니다.

  4. 조회 체인의 다음은 다음과 같습니다 (1) => "Object"

  5. 객체는 "호머"라는 방법이 있습니까? p object.instance_methods (false) .grep ( "호머") #=> [

    p object.private_instance_methods (false) .grep ( "호머") #=> [ "호머"

Candy는 조회 체인에 객체를 가지고있어 개인 인스턴스 방법 "호머"가 있으므로 메소드 해상도가 성공합니다.

그만큼 DEF 문 항상 클래스에서 메소드를 정의합니다 본인 정의의 시점에 있습니다

  1. 무엇인가요 본인 호머가 정의되기 직전에?

    p self #=> Main Def Homer Puts "Hello"End

  2. 그렇다면 그 유형은 무엇입니까?

    p self.class #=> 객체

그것 때문에 호머 끝납니다 물체

기술적으로, 정의 homer 메소드는 실제로 있습니다 Kernel 혼합 된 모듈 Object, 켜져 있지 않습니다 Object 곧장. 그렇게 할 때 homer 로컬 변수 또는 정의 된 인스턴스 메소드가 아닙니다. Candy, Ruby Method 상속 체인이 후속 조치를 취합니다. Object 그런 다음 혼합 된 것입니다 Kernel 모듈 과이 코드가 실행됩니다.

편집하다: 죄송합니다. 왜 이걸 생각했는지 모르겠습니다. 이 방법은 실제로 계속되어있는 것 같습니다 Object. 그것이 실제로 실제로 차이를 만들지는 모르겠지만 게시하기 전에 확인해야합니다.

루비에는 자유 플로팅 기능이 없습니다. 모든 방법은 일부 객체에 속합니다. 당신이하는 방법 def 최상위 수준에서 실제로 클래스의 인스턴스 방법이됩니다. Object. 모든 것이 an이기 때문입니다 Object 어느 수준에서, 모든 객체는 액세스 할 수 있습니다 Object인스턴스 방법.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top