ProgramingTip

루비에서 to_s 대 to_str (그리고 to_i / to_a / to_h 대 to_int / to_ary / to_hash)

bestdevel 2020. 11. 21. 09:31
반응형

루비에서 to_s 대 to_str (그리고 to_i / to_a / to_h 대 to_int / to_ary / to_hash)


저는 Ruby를 배우고 있는데, 특히 to_svs to_str(그리고 준비하게 to_i/ to_int, to_a/ to_ary, & to_h/ to_hash) 저를 약간 헷갈리는 몇 가지 방법을 보았습니다 . 내가 읽은 내용 짧은 형식 (예 :) to_s은 명시 적 변환을위한 것보다 긴 형식은 암시 변환을 홍보 설명합니다 .

to_str실제로 어떻게 사용 하는지는 잘 모르겠습니다 . String 이외의 것이 정의 to_str될까요? 이 방법을 실용적으로 적용 할 수 있습니까?


먼저 루비 의 "short"(예 : to_s/ to_i/ to_a/ to_h) 대 "long"(예 : to_str/ to_int/ to_ary/ to_hash) 강압 방법의 각 쌍에 적용됩니다 (각 유형에 대해).


그들은 다른 의미를 가지고 있습니다. to_strobject- 문자열로 표현할 수있는 것이 아니라 문자열처럼 작동 하지 않는 한 구현해서는 안됩니다 . 구현하는 유일한 핵심 클래스 to_str는 문자열 자체입니다.

에서 루비 프로그래밍 (에서 인용 이 블로그 게시물 을 모두 읽을 가치가있다)

[ to_ito_s]는 특별히 엄격하지 않습니다. 예를 들어 가지고있는 것이 소유처럼 괜찮은 표현을 가지고 있고 아마도 to_s메소드 가있을 것입니다 ... [ to_intto_str] 변환 함수입니다. [사용자] 객체가 자연스럽게 할 수있는 경우에만 구현합니다. 모든 곳에서 사용 가능합니다.

Pickaxe의 이전 Ruby 문서 에는 다음과 같은 내용이 있습니다.

달리 to_s거의 모든 클래스에서 지원하는 클래스로 클래스 to_str만 같은 역할을 수행합니다.

예를 들어, 아니라뿐만 정수 , 두 플로트숫자 구현 to_int( to_i의 등가 to_str(그들은 모두 실제로 숫자)) 둘 다 쉽게 정수를 대체 할 수 있기 때문에입니다 . 클래스가 String과 비슷하게 접근 한 관계가 아니라면 to_str.


당신이 구현 / 사용하는 경우는 이해하기 to_s/ 일부 예시 to_str에서의 모습을 보자. 제대로 방법이 실패 할 때 고려하는 것이 드러납니다 .

1.to_s              # returns "1"
Object.new.to_s     # returns "#<Object:0x4932990>"
1.to_str            # raises NoMethodError
Object.new.to_str   # raises NoMethodError

보시다시피, 어떤 물체라도 문자열로 to_s바꾸는 것을 기쁘게 생각 합니다. 반면에 어디에있는 변수가 문자열처럼 문자열 to_str 오류를 발생합니다 .


이제 Array#join.

[1,2].join(',')     # returns "1,2"
[1,2].join(3)       # fails, the argument does not look like a valid separator.

유용하다 Array#join전에로 변환하는 그들에 정말 무엇이든 배열의 항목, 그래서 Array#join통화 to_s그들에.

그러나 구분 기호는 반드시 있어야합니다. 누군가 호출 [1,2].join(3)하면 실수를 할 가능성이 있습니다 . 이것이 분리기를 Array#join호출 to_str하는 이유 입니다.


다른 방법에도 적용되는 원칙이 적용됩니다. 고려 to_a/ to_ary해시에 :

{1,2}.to_a      # returns [[1, 2]], an array that describes the hash
{1,2}.to_ary    # fails, because a hash is not really an array.

요약하면 다음과 가변합니다.

  • to_s패키지를 설명하는 것을 가져 오기 위해 호출 합니다.
  • to_str구현이 실행됩니다. 작동하는지 확인하기 위해 호출 합니다.
  • to_s를 설명하는 object-문자열을 작성할 수있을 때 구현 합니다.
  • to_str이를 구현할 때 완벽하게 동작 할 수 있습니다.

to_str자신을 구현할 수있는 경우 는 아마도 ColoredString클래스 일 것입니다. 색상이 붙은 염색입니다. 컬러 쉼표를 이에 통과하는 것을 당신에게 분명히 보인다-plane join실수하지 않고 초래한다 "1,2"(해당 문자열이 착색되지 않을지라도), 다음 않는 구현 to_strColoredString에.


Zverok는 언제 무엇을하는지에 대한 매우 쉽게 찾을 수 있습니다 (to_h 및 to_hash로 설명 됨).

해당 메소드를 구현하는 객체가 품번-> 사용으로 변환 될 수 있는지 아니면 to_s
어떤 유형 (향상된)이 있는지 확인해야합니다.to_str


to_hashgem 'configuration' ( GitHubConfiguration.rb ) 에서 구성 클래스에 대한 의미있는 사용법을 실제로 보았습니다.

이름에서 알 수있는 구성을 나타냅니다. 실제로는 하나로 변환 할 수있는 것이 아니라 전용 해시 (추가 기능 포함)입니다.

참고 URL : https://stackoverflow.com/questions/11182052/to-s-vs-to-str-and-to-i-to-a-to-h-vs-to-int-to-ary-to -해시 인 루비

반응형