유형 강제는 객체의 유형을 해당 값과 함께 다른 유형으로 변경하는 것입니다. 예를 들어 #to_s를 사용하여 정수를 문자열로 변경합니다. 또는 #to_i를 사용하여 정수로 부동 소수점 . 아마도 덜 알려진 #to_str 그리고 #to_int 일부 개체가 구현하는 메서드는 얼핏 보면 동일한 작업을 수행하지만 몇 가지 차이점이 있습니다.
이번 AppSignal 아카데미 에디션에서는 Ruby에서 유형을 명시적으로 캐스팅하고 암시적으로 강제하는 방법에 대해 알아보고 유형 캐스팅 행위자에 대해서도 간략하게 살펴보겠습니다. 두 가지 방법의 차이점을 알아보고 사용법에 대해 논의하겠습니다.
먼저 명시적 캐스팅 도우미를 사용하여 Ruby에서 일반적으로 값을 다른 유형으로 강제 변환하는 방법을 살펴보겠습니다.
명시적 캐스팅 도우미
가장 일반적인 캐스팅 도우미는 #to_s입니다. , #to_i , #to_a 및 #to_h . 이는 명시적 캐스팅 방법입니다. 값을 한 유형에서 다른 유형으로 쉽게 변환하는 데 도움이 됩니다.
명시적인 도우미는 명확한 약속을 가지고 옵니다. #to_s일 때마다 객체에 대해 호출되면 항상 객체가 실제로 문자열로 잘 변환되지 않더라도 문자열을 반환합니다. 마이클 키튼을 배트맨으로 캐스팅하는 것과 같습니다. 코미디 배우가 그 역할에 특별히 적합하지 않더라도 배트맨을 맡을 수 있습니다.
Ruby는 Ruby 표준 라이브러리의 거의 모든 기본 개체에 대해 이러한 도우미 메서드를 제공합니다.
이러한 방법, 특히 #to_s 는 Ruby의 대부분의 기본 유형에서 구현됩니다. 캐스팅은 거의 항상 값을 반환하지만 결과는 우리가 기대하는 것과 다를 수 있습니다.
#to_s에 전화 걸기 , #to_i , #to_a 및 #to_h 도우미는 선택한 유형에 모든 값을 적용합니다. 값에 어떤 일이 발생하는지에 관계없이 강제된 유형의 표현을 반환합니다.
암시적 강제 방법
캐스팅하려는 유형과 다르게 작동하는 값에 대해 유형 캐스팅 메소드를 호출하면 오류가 발생하거나 데이터가 손실될 수 있습니다. Ruby는 객체가 해당 유형처럼 작동할 때만 값을 반환하는 암시적 강제 변환 메서드도 제공합니다. 이렇게 하면 값이 우리가 원하는 유형처럼 작동하는지 확인할 수 있습니다. 이러한 암시적 강제 방법은 #to_str입니다. , #to_int , #to_ary 및 #to_hash .
암묵적 강제는 Leonard Nimoy를 Spock이 아닌 다른 역할로 캐스팅하는 것과 같습니다. 캐릭터가 Spock과 충분히 가까우면 작동하지만 그렇지 않으면 실패합니다. #to_str 도우미가 시도 문자열로 변환하지만 NoMethodError가 발생합니다. 객체가 메소드를 구현하지 않고 암시적으로 강제될 수 없는 경우
이제 Ruby는 요청된 유형을 강요하지 않고 수행하는 작업에 있어서 좀 더 엄격하다는 것을 알 수 있습니다. 강제가 불가능할 경우 #to_* 메소드가 객체에 구현되지 않았으며 이를 호출하면 NoMethodError가 발생합니다. .
암시적 강제를 사용하는 경우 #to_str , 원래 유형도 String처럼 작동하는 경우에만 함수에 String 객체를 반환하도록 요청합니다. 이러한 이유로 #to_str Ruby 표준 라이브러리의 문자열에서만 구현됩니다.
루비가 암시적 강제를 사용하는 방법
강제하는 동안 우리가 요구하는 내용을 더 정확하게 설명하는 것 외에 암시적 강제는 또 어떤 용도로 유용합니까? Ruby는 상당히 많은 시나리오에서 암시적 강제 자체를 사용하는 것으로 나타났습니다. 예를 들어 +으로 객체를 결합하는 경우 .
여기에서는 Ruby가 TypeError를 올리는 것을 볼 수 있습니다. Name에서 암시적 변환을 수행할 수 없기 때문입니다. String에 입력하세요. .
#to_str을 구현하면 수업에서 Ruby는 Name를 강제하는 방법을 알고 있습니다. 입력하세요.
배열 및 #to_ary에서도 동일하게 작동합니다. .
하지만 #to_ary 더 많은 시나리오에서 사용됩니다. 이를 사용하여 배열을 별도의 변수로 분해할 수 있습니다.
또한 객체를 블록 매개변수로 변환합니다.
#to_hash와 같이 암시적 강제 변환 방법이 사용되는 더 많은 시나리오가 있습니다. ** 사용 . 이는 #to_hash를 사용하여 값을 해시로 강제 변환합니다. parse_options에 전달하기 전에 방법입니다.
강제 유형
또한 Ruby는 유형이 알 수 없는 유형이고 올바른 유형을 얻고자 할 때 보다 탄력적인 강제 방법을 제공합니다. 모든 기본 유형(String(...))마다 하나씩 있습니다. , Integer(...) , Float(...) , Array(...) , Hash(...) 등).
String(...) 메소드는 먼저 #to_str 호출을 시도합니다. 값에 대해 알아보고 실패하면 #to_s을 호출합니다. 방법. 모든 객체가 #to_str를 정의하는 것은 아닙니다. 따라서 암시적 강제 변환(#to_str)을 모두 사용하여 확인합니다. ) 및 명시적(#to_s ) 캐스팅 방법을 사용하면 문자열 변환이 작동하고 원하는 값을 얻을 가능성이 높아집니다. 먼저 암시적 강제를 호출하면 "#<Object:0x00007f8e6d053a90>"과 같은 값이 아닌 강제 유형의 결과를 얻을 가능성이 더 높습니다. .
강제되는 유형처럼 작동하는 객체에 대해서만 암시적 형변환 메소드를 구현해야 합니다. #to_str 자신만의 String 클래스를 만들 수 있습니다.
먼저 암시적 강제를 시도하는 것 외에 String(...) 도우미는 반환된 유형도 확인합니다. #to_str 문자열이 아닌 값도 포함하여 모든 유형의 값을 반환할 수 있는 메서드일 뿐입니다. 요청된 유형 String(...)의 값을 얻으려면 TypeError이 발생합니다. 유형이 일치하지 않는 경우.
여기서는 Ruby가 #to_str의 결과를 무시하는 것을 볼 수 있습니다. nil을 반환했기 때문입니다. , 이는 문자열 유형이 아닙니다. 대신 #to_s으로 대체됩니다. 결과입니다.
#to_s인 경우 nil도 반환합니다. 따라서 올바른 유형이 아닙니다. String(...) TypeError가 발생합니다. .
유형 강제를 적용하는 데 더 안정적일 수 있지만 캐스팅 도우미 메서드(String(...))에 유의하세요. , Integer(...) 등)은 일반적으로 주어진 값에 대해 더 많은 검사를 수행해야 하기 때문에 약간 느립니다.
결론
객체에 대해 올바른 유형의 데이터를 처리하고 있는지 확인하려는 경우 유형 강제 변환이 유용한 프로세스입니다. 이 게시물에서는 #to_s와 같은 명시적 형변환 도우미에 대한 지식을 새롭게 했습니다. , #to_i , #to_a 및 #to_h . #to_str과 같은 암시적 도우미가 있는 경우도 살펴보았습니다. , #to_int , #to_ary 및 #to_hash 유용하며 Ruby 자체에서 사용되는 방식입니다.
이 유형 강제 개요가 유용하고 행위자 유형 변환 비유를 어떻게 찾았기를 바랍니다. 언제나 그렇듯, 다루었으면 하는 주제가 있으면 알려주시기 바랍니다. 질문이나 의견이 있으시면 주저하지 말고 @AppSignal로 연락주세요.