2015-01-23 4 views
0

여기에 내가 String 클래스의 to_s 오버라이드 (override) 한 IRB 세션의에 기대하는 것처럼 암시 적으로 명시하지 오버라이드 (override) 그리고 to_s 메소드를 호출해야합니까하지만 명시 적으로 to_s 전화를했다 :왜 내가 박았

➜ irb 
2.2.0 :001 > class String 
2.2.0 :002?> def to_s 
2.2.0 :003?>  swapcase 
2.2.0 :004?>  end 
2.2.0 :005?> end 
=> :to_s 
2.2.0 :006 > puts 'hello' 
hello 
=> nil 
2.2.0 :007 > p 'hello' 
"hello" 
=> "hello" 
2.2.0 :008 > puts 'hello'.to_s 
HELLO 
=> nil 
+0

➜ IRB 2.2.0 : 001> String 클래스 2.2.0 : 002> 데프 그리고 to_s 2.2.0 : 003> swapcase 2.2.0 :? 004> 최종 2.2.0 : 005> 결국 => 2.2.0 그리고 to_s : 007> P '안녕하세요' "안녕하세요" => "안녕하세요" 2.2.0 : 008 006>은 => 닐 2.2.0 안녕하세요 '안녕하세요'둔다 > puts 'hello '.to_s HELLO => nil –

+1

스택 오버플로를 사용하면 코드를 멋지게 형식화 할 수 있습니다. 주석을 사용하거나 외부 사이트에 링크하는 대신 코드의 서식을 사용하십시오. –

+0

고마워 .. 루비와 스택 오버플로 모두에서 초보자. 내 미래의 게시물에 그 점에 유의할 것입니다. –

답변

2

이를 puts은 아직 문자열이 아닌 항목에 대해서만 to_s을 호출하기 때문에 작동하지 않습니다. 반면에 당신이 to_s 정의했다면 귀하의 경우 'hello '에서 이미 문자열, 그래서 puts 그것에 to_s를 호출 할 필요가 없습니다

(puts 또한 배열 같은 다른 클래스의 명시 적 구현을 ​​포함) 메서드가 이미 String이 아닌 경우 to_s 메서드를 호출해야합니다.

class Foo 
    def to_s 
    'hello world' 
    end 
end 
puts Foo.new 

은 'hello world'를 출력합니다.

+0

네 .. 그냥 to_s의 구현을 보았다. 말했듯이 클래스가 문자열인지 확인합니다. –