2017-11-14 26 views
1

나는 클래스 Word이? Word#reverseString을 반환하는 String#reverse을 상속하므로 String을 반환해야합니다. 따라서 둘은 magic과 동일한 방법을 가지고어떻게 'String # reverse'가 non-'String '객체를 반환 할 수 있습니까?</p> <pre><code>class Word < String end w = Word.new("level") y = w.reverse y.class # => Word </code></pre> <p>1) 어떻게 이런 일이 가능 :

class Word < String 
    attr_accessor :s 

    def magic 
    @s = Time.now 
    end 
end 

y.magic 
sleep(5) 
w.magic 
y.s == w # => false 
y == w # => true 

2) 및 wyWord가 있고, 동일 :

는이 코드를 말했다. ymagic 방법을 얻었습니까?

3) 어떻게 은 true으로 평가되는데 y.sw.s은 다른 값을 반환합니까?

+0

내가 두 번째 질문이 무엇을 의미하는지 모르겠습니다. – sawa

답변

7

String#reverse 상태에 대한 문서 동안 :

는 역순으로 STR에서 문자로 새로운 캐릭터 라인을 돌려줍니다.

당신은 당신이 라인

rev = rb_str_new_with_class(str, 0, RSTRING_LEN(str)); 

를 볼 수있는 방법을 열 팝업하고 rev 실제로 반환됩니다 어떤 경우 그래서 당신은, String의 반환 유형을 기대할 수 있습니다. 내 C는 상당히 녹슬었지만 루비의 C 코드를 살펴보면 그 방법이 rb_str_new_with_class 인 것처럼 보일 것입니다. 어떤 클래스의 새로운 인스턴스가 생성됩니다.이 경우 입니다. 따라서 문서가 의미하는 것은 새로운 문자열을 반환한다고 말하면이 문자열이 어떤 클래스의 새 인스턴스를 반환한다는 것입니다. 대부분의 경우 String입니다.

그래서는 현재 문자열이 무엇이든 클래스, 그것은 w.reversemagic 방법을 가지고 결국 어떻게 ... Word 그것에게 방법을 주었기 때문에 쉽게 알의 새 인스턴스를 만드는 방법을 알고, 그리고 그것은 Word이다.

마지막으로 어떻게 동일합니까? 메서드를 새로 정의하지 않으므로 부모 변수 String#== 메서드가 필요합니다.이 메서드는 인스턴스 변수가 있는지를 모르고 신경 쓰지 않고 문자열 값을 비교하고 필요에 따라 to_str을 사용하여 강제로 값을 비교합니다. 당신도 할 수 :

Word.new("level") == "level" # => true 

(참고 : Word가 강요 여부되면 어떻게 실제로 모르겠어요.)