Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby 변환 방법(to_s, to_a, to_str)을 사용하는 방법

정수로 작업하지만 문자열 메서드(예: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도 좋아할 것입니다. 확인해보세요.