2014-07-24 2 views
1

전달 된 유형의 이름 (예 : String.name # => 'String')으로 변환하는 방법을 알고있는 Callable (이 경우 Lambda)을 반환하는 루비의 간단한 팩토리를 작성합니다.#to_s가 실패 할 수 있습니까?

Fixnum을 캐스팅하려고하면 Integer을 사용하고 있습니다. 전달 된 값을 변환 할 수 없으면 실패합니다. 마찬가지로 나는 단순히있는, 나는 믿는다 String 변환하지만, 모두가 실패 할 수 있기 때문에 내 Lambda의 다소 일관성있게 (인상 #to_s를 사용하지만, 내가 발견, String의 자신을 등 Float, Time.zone.parse(x).to_time, ...

을 사용하고 있습니다 Exception).

레일스가 제공하는 것 이외의 악의적 인 원숭이 패치가 없다고 가정하면 #to_s이 예외를 발생시키지 않을 것입니까?

+0

[String.to_s documentation] (http://www.ruby-doc.org/core-2.1.2/String.html#method-i-to_s) :'수신자를 반환합니다. ' –

답변

1

모든 개체는 기본값 to_sinspect을 구현하는 Object에서 상속되며 "#"문자열을 반환합니다. 따라서 해당 정의를 재정의하지 않으면 #to_s가 모든 클래스에서 작동합니다.

그러나 #to_s의 자체 구현을 작성하고 거기에서 예외를 발생시킬 수는 있지만 가능성은 희박합니다. 왜 누군가가 그렇게해야하는지는 상상할 수 없습니다.

+1

실제로 BasicObject (에서 상속받을 수 있습니다. 어떤 to_s 구현하지 않습니다) –

+0

오른쪽! 어쨌든 그것은별로 평범하지 않습니다. – Grych

0

Ruby의 모든 객체는 to_s 구현이있는 기본 객체에서 상속되므로 괜찮을 것입니다. 결과를 항상 예측할 수있는 것은 아닙니다. 예를 들어

. nil.to_s는 ""를 반환합니다.

+3

'nil .to_s'는 빈 문자열을 반환하는 것이 완전히 예측 가능합니다. –

+0

가난한 단어 선택. 많은 사람들은 기대하지 않습니다.실제로 ""를 반환 할 때 "nil"을 반환하는 to_s. 어떤 사람들에게는 이것이 최소한의 놀라움의 원칙에 위배됩니다. 우리는 하루 종일 그것에 관해 논할 수 있습니다, 그것은 제가 제 의견을 의미하는 전부입니다. –

+0

@JeffPrice Matz는 예측 가능성/일관성보다 편리 성을 우선시하는 것으로 보입니다. '' "를 리턴하는'nil.to_s'는''nil''을 리턴하는 것보다 훨씬 더 유용합니다. – sawa

0

#to_X 방법 (to_a, to_h, to_s, to_f, to_i, to_c, to_r) 및 to_XYZ (to_ary, to_hash, to_str, to_float, to_int, to_sym, to_proc, to_io, to_enum, to_path) 방법이 생각하지 실패. 객체가 일부 또는 모두에 응답하지 않을 수 있지만 이 응답하는 경우이 실패하면 실패하지 않아야하며 예외가 발생해서는 안되고 올바른 클래스의 인스턴스를 반환해야합니다.

실제로 이것이 문서에서 명시 적으로 철자가 맞는지 확실하지 않지만 Ruby 커뮤니티에서이를 처리하는 방법은 확실하지 않습니다.

Kernel#XYZ 방법 (Kernel#Array, Kernel#Complex, Kernel#Float, Kernel#Hash, Kernel#Integer, Kernel#Rational, Kernel#String) 인수가 변환되지 않은 경우 OTOH 예외를 발생시킬 것이다.

그래서, 짧은 : 객체가 (하지만 매우 드문입니다) 다음은 그러나 단순히 to_s에 응답하지 않도록 선택할 수 있습니다 실패하지해야 to_s에 응답 IFF에.

관련 문제