필자는 내가 찾고있는 것의 예로서 파이썬을 사용할 것이다 (파이썬을 모른다면 의사 코드로 생각할 수 있음).
>>> a = 1
>>> type(a)
<type 'int'>
나는 루비에서 내가 할 수있는 것을 안다.
1.9.3p194 :002 > 1.class
=> Fixnum
그러나 이것이 객체의 유형을 결정하는 적절한 방법입니까?
필자는 내가 찾고있는 것의 예로서 파이썬을 사용할 것이다 (파이썬을 모른다면 의사 코드로 생각할 수 있음).
>>> a = 1
>>> type(a)
<type 'int'>
나는 루비에서 내가 할 수있는 것을 안다.
1.9.3p194 :002 > 1.class
=> Fixnum
그러나 이것이 객체의 유형을 결정하는 적절한 방법입니까?
답변:
루비 세계에서 흔들리는 용어 인 객체의 "유형"을 결정하는 올바른 방법은을 호출하는 것 object.class
입니다.
클래스는 다른 클래스에서 상속 할 수 있기 때문에 객체가 "특정 유형"인지 object.is_a?(ClassName)
확인하려면 object
유형이 있는지 ClassName
또는 파생 된 것인지 확인하기 위해 호출 할 수 있습니다 .
루비에서는 일반적으로 타입 검사가 수행되지 않지만, 일반적으로 " Duck 타이핑 " 이라고하는 특정 방법에 응답하는 능력에 따라 객체가 평가 됩니다 . 즉, 원하는 메소드에 응답하는 경우 유형에 대해 특별한 이유가 없습니다.
예를 들어, object.is_a?(String)
다른 클래스가 문자열로 변환하는 메소드를 구현하거나 String이 동작하는 방식과 동일하게 작동하기 때문에 너무 강합니다. object.respond_to?(:to_s)
문제의 객체가 원하는 것을 수행하는지 테스트하는 더 좋은 방법입니다.
#class
하지 않고 클래스를 반환합니다 . 이름은 죽은 선물이어야합니다. 클래스와 타입은 OO에서 완전히 다른 개념입니다.
typeof
에서 C, JavaScript 및 기타에서 가장 가까운 것은 입니다 class
. Ruby에는 다른 언어와 마찬가지로 공식적인 프로토콜 시스템이 없으며 Objective-C는 이에 가장 가까운 Smalltalk입니다. "유형"을 "허용 가능한 결과를 가진 특정 메소드 세트에 응답하는 오브젝트"로 정의하는 경우에는 실제로이를 주장 할 방법이 없습니다. 너무 느슨합니다. Ruby에서 대부분 객체 유형을 언급 할 때 클래스에 대해 이야기하고 있음을 이해합니다. 바로 그 이유 때문에 용어 유형을 따옴표로 사용했습니다.
int i
"또는 " Integer j
tadman 모두 질문자를 만족 듯하는 방식으로 질문에 대답".) 루비가 사용하는 용어를 명확하게하면서 일반 사용자 나는 객체 지향 용어의 세밀한 부분을 학문적으로 나누는 데 관심이 없으므로 마지막 단어를 사용하십시오.
당신은 또한 시도 할 수 있습니다 : instance_of?
p 1.instance_of? Fixnum #=> True
p "1".instance_of? String #=> True
p [1,2].instance_of? Array #=> True
루비에서는 종종 객체의 클래스가 무엇인지 상관하지 않으며, 그 자체로 특정 메소드에 응답하는 것만 신경 쓰면됩니다. 이것을 오리 타이핑 이라고하며 모든 종류의 루비 코드베이스에서 볼 수 있습니다.
따라서 대부분의 경우는 아니지만 다음을 사용하여 Duck Typing을 사용하는 것이 가장 좋습니다 #respond_to?(method)
.
object.respond_to?(:to_i)
나는 "예"라고 말할 것입니다. "Matz"가 그의 대화 중 하나에서 이와 같이 말했듯이 "Ruby 객체에는 유형이 없습니다." 모든 것이 아니라 그가 우리를 만나려고하는 부분입니다. 그렇다면 왜 "모든 것이 대상"이라고 말했 을까요? 덧붙여서 그는 "데이터에는 객체가 아닌 타입이있다"고 말했다.
그래서 우리는 이것을 즐길 수 있습니다.
https://www.youtube.com/watch?v=1l3U1X3z0CE
그러나 루비는 클래스의 객체 유형에 크게 신경 쓰지 않습니다. 우리는 타입이 아닌 클래스를 사용합니다. 모든 데이터에는 클래스가 있습니다.
12345.class
'my string'.class
그들은 또한 조상이있을 수 있습니다
Object.ancestors
그들은 또한 메타 클래스를 가지고 있지만 그에 대한 세부 정보를 저장할 것입니다.
수업을 알고 나면 어떤 방법을 사용할 수 있는지 찾아 볼 수 있습니다. "데이터 유형"이 필요한 곳입니다. 당신이 정말로 세부 사항을 찾으려면 조회 ...
"루비 객체 모델"
Ruby가 객체를 처리하는 방법에 사용되는 용어입니다. 그것은 모두 내부적이므로 실제로 많은 것을 보지 못하지만 알아두면 좋습니다. 그러나 그것은 또 다른 주제입니다.
예! 클래스는 데이터 유형입니다. 객체에는 클래스가 있고 데이터에는 유형이 있습니다. 따라서 데이터베이스에 대해 알고 있다면 유한 한 유형의 세트 만 있다는 것을 알 수 있습니다.
텍스트 블록 번호
Object.ancestors # => [Object, Kernel, BasicObject]
isinstance
응답이 필요 하거나 확인 해야 합니다. 그러나 단순히 "NOES !!!"라고 말하면 정말 도움이되지 않습니까? 대신 교육을 고려하십시오.