정수로 작업하지만 문자열 메서드(예:gsub
) 대신
무엇을 할 수 있나요?
문자열로 변환합니다(to_s
사용). ) 그런 다음 다시 정수로 변환합니다( to_i
사용). ).
예를 들어 :
Integer
를 변환할 수 있습니다. String
에 1 "1".
그런 다음 새 클래스의 메서드를 사용할 수 있으므로 이전에는 불가능했던 작업을 수행할 수 있습니다.
Ruby에서 기억하세요...
모든 개체는 클래스와 연결되며 모든 클래스에는 특정 메서드 집합이 있습니다.
이 문서에서 배울 내용은 :
- Ruby에서 사용할 수 있는 변환 방법
- 그들 사이의 차이점은 무엇입니까!
- 다양한 상황에서 올바른 것을 선택하는 방법
해보자!
짧은 변환 방법(to_s, to_i)
이 첫 번째 전환 방법 그룹에 대해 잘 알고 있을 것입니다.
다음과 같은 방법 :
- to_i
- to_s
- to_a
이 메서드는 현재 개체를 나타내는 특정 클래스의 새 개체를 반환합니다.
예를 들어 :
(1..10).to_a # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
이것은 :
<블록 인용>
"Range
를 변환하고 싶습니다. 1..10을 Array
로 그 범위를 나타냅니다.”
Ruby가 이러한 변환 방법을 암시적으로 호출하는 방법이 있습니다.
문자열 보간에서와 같이:
"#{1}"
이것은 1.to_s
를 호출합니다. 당신을 위해, 비록 당신이 그것을 볼 수 없습니다.
이 코드로 자신을 확인할 수 있습니다. :
module Log def to_s puts "to_s called" super end end class Integer prepend Log end puts "#{1}" # "to_s called"<블록 인용>
참고 :Fixnum
을 사용해야 합니다. Integer
대신 Ruby 2.3 이상을 사용하는 경우. 아니면 더 나은 방법으로 Ruby 버전을 업데이트하세요. 🙂
이러한 메서드는 매우 관대하며 예외를 발생시키지 않아야 합니다.
예를 들어 :
"aaaaaa".to_i # 0
이 0
당신을 놀라게 할 수 있습니다.
하지만 이것이 to_i
를 호출할 때 얻을 수 있는 것입니다. 정수가 없는 문자열에서.
이 문서의 뒷부분에서 볼 수 있듯이 이 방법의 더 엄격한 버전이 있습니다. .
긴 변환 방법(to_str, to_int)
지금:
이러한 짧은 변환 방법이 있는 경우 to_str
과 같은 방법이 필요한 이유는 무엇입니까? , 또는 to_int
?
차이점은 무엇입니까?
차이점은 의도에 있습니다.
모든 Ruby 클래스(BasicObject
제외) )는 to_s
를 구현합니다. 어떤 유형의 문자열 표현으로 자신을 반환하는 메서드입니다.
하지만 클래스가 문자열을 반환한다고 해서 문자열처럼 동작하는 것은 아닙니다!
예를 살펴보겠습니다. :
"" + 1 # TypeError: no implicit conversion of Fixnum into String
생각해 보세요 :
빈 문자열과 정수는 무엇을 반환해야 합니까?
잘 모르겠습니다.
"1"(숫자가 1인 문자열)이라고 말할 수 있습니다.
그런데 왜요?
이것은 대부분의 사람들이 이 경우에 기대하는 것이 아닙니다.
더하는 것은 의미가 없습니다... 이것이 TypeError
가 발생하는 이유입니다. .
그리고 그것이 허용되더라도.
이건 어때 :
"" + {}
빈 문자열과 빈 해시입니다.
말도 안 돼!
따라서 Ruby는 다른 객체가 다형성에 좋지 않은 문자열인지 확인하는 대신 문자열처럼 작동하는지 확인합니다.
바로 to_str
입니다. 방법이 들어옵니다.
Ruby 2.5에서 to_str을 구현하는 유일한 클래스 :
String
NameError::message
Warning::buffer
자신만의 변환 방법을 구현하는 방법
to_str
를 구현할 수 있습니다. 모든 수업에서.
그러면 문자열처럼 사용할 수 있습니다.
예시 :
class Cat def to_str "meow" end end "" + Cat.new # "meow"
그러나 클래스가 문자열에 해당하지 않는 한 이 작업을 수행하면 안 됩니다 .
to_s
사용 대신.
Btw, 이것은 +
에만 해당되는 것이 아닙니다. 방법.
문자열과 같은 객체만 의미가 있는 다른 장소에서도 사용됩니다.
좋아요 :
[1,2,3].join(",")
to_int
와 같은 다른 긴 변환 방법 &to_hash
같은 논리를 따르십시오.
그렇기 때문에 다양한 방법을 사용하고 있습니다.
변환 래퍼 사용 방법
아직 변환 방법이 충분하지 않은 경우... 몇 가지 더 준비되어 있으니 걱정하지 마세요!
저는 이것을 "전환 래퍼"라고 부르고 싶습니다.
그들은 :
- 배열()
- 정수()
- 해시[]
거기에 비정상적으로 보이는 방법이 있습니다!
괄호와 대괄호를 주목하세요...
...이 메서드를 클래스 이름과 구분하는 유일한 방법입니다.
이것의 목적은 무엇입니까?
Array()는 ANYTHING을 배열로 변환합니다.
다음은 몇 가지 예입니다. :
Array(nil) # [] Array([]) # [] Array(1) # [1] Array("") # [""]
이게 무슨 논리야???
이 방법은 매우 구체적인 규칙을 따릅니다. :
- 개체가
to_ary
에 응답하는 경우 , 또는to_a
그것을 호출하고 값을 반환합니다 - 그렇지 않으면 객체를 빈 배열 안에 넣고 반환합니다.
이는 위에 표시된 동작을 설명합니다.
이것은 배열을 예상하는 메서드를 작성하고 있지만 다른 것을 얻을 수 있고 메서드가 전체 응용 프로그램을 충돌시킬 수 있는 경우에 유용합니다. Array()
에 전달하여 배열인지 확인할 수 있습니다. 그것을 피하기 위해 먼저.
이제 Integer()
.
몇 가지 특별한 규칙이 있습니다 :
- 객체가 문자열이고 문자열의 내용이 Ruby의 유효한 숫자 표현을 엄격히 준수하는 경우 이 메서드는 정수를 반환합니다.
ArgumentError
발생 형식이 잘못된 경우 - 객체가 문자열이 아닌 경우
to_int
호출을 시도합니다. ,to_i
. TypeError
가 발생합니다. 개체를 유효한Integer
로 변환할 수 없는 경우 변환 방법을 사용합니다.
예 :
Integer(1) # 1 Integer("25") # 25 Integer("abc123") # ArgumentError (invalid value for Integer(): "abc123") Integer([]) # TypeError (can't convert Array into Integer)
이 Integer()
메소드는 유효한 Integer
로 작업하고 있는지 100% 확인하려는 경우에 유용합니다. .
이제 Hash[]
.
짝수 요소의 배열을 전달할 수 있습니다. 새 해시를 얻으려면:
Hash[[["a", 1], ["b", 2], ["c", 3]]] # {"a"=>1, "b"=>2, "c"=>3}
두 배열의 요소를 병합하거나 map과 같은 방법을 사용하여 해시를 구축하는 경우에 유용합니다.
요약
Ruby의 다양한 변환 방법, 그 존재 이유 및 사용 방법에 대해 배웠습니다!
도움이 되셨기를 바랍니다. 🙂
이 기사가 마음에 들었다면 제 책인 Ruby Deep Dive도 좋아할 것입니다. 확인해보세요.