programing

루비로 표시된 개체 유형 결정

lovejava 2023. 7. 13. 20:14

루비로 표시된 개체 유형 결정

제가 찾고 있는 것의 예로 파이썬을 사용하겠습니다(파이썬을 모르신다면 유사 코드라고 생각하셔도 됩니다).

>>> a = 1
>>> type(a)
<type 'int'>

루비로 제가 할 수 있다는 것을 압니다.

1.9.3p194 :002 > 1.class
 => Fixnum 

하지만 이것이 물체의 종류를 결정하는 적절한 방법일까요?

루비 세계에서 흔들리는 용어인 물체의 "유형"을 결정하는 적절한 방법은 호출하는 것입니다.object.class.

클래스가 다른 클래스에서 상속될 수 있으므로 개체가 "특정 유형"인지 확인하려면 호출할 수 있습니다.object.is_a?(ClassName)확인하기 위해object유형의ClassName또는 그것으로부터 파생됩니다.

일반적으로 형식 검사는 루비에서 수행되지 않지만, 대신 객체는 일반적으로 " 타이핑"이라고 불리는 특정 방법에 응답하는 능력을 기반으로 평가됩니다.즉, 원하는 방법에 반응한다면 그 유형에 대해 특별히 신경 쓸 이유가 없습니다.

예를들면,object.is_a?(String)다른 클래스가 이 클래스를 문자열로 변환하는 메서드를 구현하거나 문자열이 동작하는 방식과 동일하게 동작하도록 만들 수 있기 때문에 너무 경직되어 있습니다. object.respond_to?(:to_s)문제의 객체가 사용자가 원하는 것을 수행하는지 테스트하는 더 나은 방법입니다.

다음을 시도할 수도 있습니다.

p 1.instance_of? Fixnum    #=> True
p "1".instance_of? String  #=> True
p [1,2].instance_of? Array #=> True

종종 루비에서는 객체의 클래스가 무엇인지 실제로는 신경쓰지 않고, 그 자체로 특정한 방법에 반응하는 것에 신경을 씁니다.이것은 Duck Typing으로 알려져 있으며 모든 종류의 Ruby 코드베이스에서 볼 수 있습니다.

따라서 많은 경우(대부분은 아닐지라도) 다음을 사용하여 덕 타이핑을 사용하는 것이 가장 좋습니다.

object.respond_to?(:to_i)

저는 "네"라고 말할 것입니다.Matz는 그의 강연 중 하나에서 이렇게 말했습니다. "루비 물체는 유형이 없습니다."전부가 아니라 그가 우리에게 전달하려는 부분입니다.그럼 왜 "모든 것은 물체입니다"라고 말했을까요?추가하기 위해 "데이터에는 객체가 아닌 유형이 있습니다"라고 말했습니다.

RubyConf 2016 - 마츠모토 유키히로의 오프닝 기조연설.

하지만 루비는 수업만큼 사물의 종류에 신경 쓰지 않습니다.우리는 유형이 아닌 수업을 사용합니다.모든 데이터에는 클래스가 있습니다.

12345.class

'my string'.class

클래스에도 조상이 있을 수 있습니다.

Object.ancestors

메타 수업도 있지만 자세한 내용은 저장해 두겠습니다.

클래스를 알고 나면 클래스에 사용할 수 있는 방법을 찾을 수 있습니다.여기서 "데이터 유형"이 필요합니다.자세히 알아보려면 검색을...

"루비 오브제 모델"

이것은 Ruby가 객체를 처리하는 방법에 사용되는 용어입니다.모두 내부적인 것이기 때문에 잘 보이지는 않지만 알게 되어 기쁩니다.하지만 그것은 다른 주제입니다.

예! 클래스가 데이터 형식입니다.개체에는 클래스가 있고 데이터에는 유형이 있습니다.따라서 데이터베이스에 대해 알고 있다면 유한한 유형 집합만 있다는 것을 알 수 있습니다.

텍스트 블록 번호

variable_name.class

여서변이수 "a" 다니은입름"입니다.a.class

모든 변수에는 이름 클래스가 있는 소품이 있습니다.인쇄하면 어떤 유형인지 알 수 있으므로 다음과 같이 하십시오.

puts a.class

언급URL : https://stackoverflow.com/questions/15769739/determining-type-of-an-object-in-ruby