루비에서 객체의 유형 결정


364

필자는 내가 찾고있는 것의 예로서 파이썬을 사용할 것이다 (파이썬을 모른다면 의사 코드로 생각할 수 있음).

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

나는 루비에서 내가 할 수있는 것을 안다.

1.9.3p194 :002 > 1.class
 => Fixnum 

그러나 이것이 객체의 유형을 결정하는 적절한 방법입니까?


5
@ JörgWMittag 그러나 AFAICR은 파이썬에서`type`이하는 일이지만 메모리는 흐릿합니다. isinstance 응답이 필요 하거나 확인 해야 합니다. 그러나 단순히 "NOES !!!"라고 말하면 정말 도움이되지 않습니까? 대신 교육을 고려하십시오.
Dave Newton

4
@ JörgWMittag 공감하는 동안 OP는 Ruby에서 흉내낼 수있는 코드를 제공했습니다. 실제로 NOS가 도움이되지 않는다고 말하는 OP를 교육 하지 않는 한 IMO. OP는 코드를 통해 원하는 것을 정의했기 때문에 정보 제공 만 가능할 것입니다.
Dave Newton

5
@ JörgWMittag-Ruby에서는 모든 것이 Object이므로 Python에서와 같이 기본 유형이 없습니다 (int, long, boolean 등) Ruby 내의 결과로 클래스는 유형 정의입니다. 이것은 Ruby로 제한되지 않으며, class와 type이라는 단어는 다른 여러 언어에서 동의어이며 OOP 이론에서는 더 광범위합니다.
ocodo

6
여기서 루비에 대해 이야기하고 있기 때문에 타입과 클래스는 동의어입니다. 이에 대한 논쟁은 없습니다. 모든 값은 객체입니다. 그래서 단순히 루비에 대해 이야기 누군가를 위해, 클래스 이다 유형. -심판 : ruby-lang.org/en/about
ocodo

2
@ JörgWMittag 그 에세이는 지금까지 매우 유익한 정보이며, 기회가 생겼을 때 나머지 내용을 읽겠습니다. 특히, Cook은 파이썬, 루비 및 기타 동적 형식 언어가 " 실제로 반대 하지 않는다"고 주장하는 것이 왜 틀린지에 대해 잘 설명하고 있습니다 (내 지식보다 훨씬 많은 배경 지식을 가지고 있음). 지향적 "(아마도 그것을 깨닫지 못한 채, ADT 지향적이지 않다는 의미). 그러나 Ruby는 정적으로 유형이 지정되지 않았으므로 Cook이 설명하는 의미에서 ADT가 없으므로 해당 구별에 대한 귀하의 반대 의견은 도움이되지 않습니다.
Kyle Strand

답변:


607

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

클래스는 다른 클래스에서 상속 할 수 있기 때문에 객체가 "특정 유형"인지 object.is_a?(ClassName)확인하려면 object유형이 있는지 ClassName또는 파생 된 것인지 확인하기 위해 호출 할 수 있습니다 .

루비에서는 일반적으로 타입 검사가 수행되지 않지만, 일반적으로 " Duck 타이핑 " 이라고하는 특정 방법에 응답하는 능력에 따라 객체가 평가 됩니다 . 즉, 원하는 메소드에 응답하는 경우 유형에 대해 특별한 이유가 없습니다.

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


13
-1. 객체의 유형을 반환 #class하지 않고 클래스를 반환합니다 . 이름은 죽은 선물이어야합니다. 클래스와 타입은 OO에서 완전히 다른 개념입니다.
Jörg W Mittag

78
@ Jörg W Mittag : 동의하지 않습니다. "클래스"와 "프로세서 속도"(예제 선택)는 완전히 다른 개념이지만 "클래스"와 "타입"은 밀접한 관련 개념입니다. 예를 들어, 클래스에 대한 Wikipedia 기사 의 내용 은 다음과 같습니다. "객체 지향 프로그래밍에서 클래스는 고유 한 유형을 정의하는 데 사용되는 구조입니다." tadman은 질문자에게 도움이되고있었습니다.
Teemu Leisti

18
@ JörgWMittag Ruby typeof에서 C, JavaScript 및 기타에서 가장 가까운 것은 입니다 class. Ruby에는 다른 언어와 마찬가지로 공식적인 프로토콜 시스템이 없으며 Objective-C는 이에 가장 가까운 Smalltalk입니다. "유형"을 "허용 가능한 결과를 가진 특정 메소드 세트에 응답하는 오브젝트"로 정의하는 경우에는 실제로이를 주장 할 방법이 없습니다. 너무 느슨합니다. Ruby에서 대부분 객체 유형을 언급 할 때 클래스에 대해 이야기하고 있음을 이해합니다. 바로 그 이유 때문에 용어 유형을 따옴표로 사용했습니다.
tadman

14
@ Jörg W Mittag : 나는 인용에서 알 수 있듯이 "class"와 "type"이 OO에서 완전히 다른 개념은 아니라고 계속 주장한다. (또한 : 당신은 어떻게 제공함으로써 자바에서 변수를 선언 할 하나 유형 또는 클래스 "이름 뒤에 변수를 int i"또는 " Integer jtadman 모두 질문자를 만족 듯하는 방식으로 질문에 대답".) 루비가 사용하는 용어를 명확하게하면서 일반 사용자 나는 객체 지향 용어의 세밀한 부분을 학문적으로 나누는 데 관심이 없으므로 마지막 단어를 사용하십시오.
Teemu Leisti

11
@TeemuLeisti 여기서 문제의 대부분은 Ruby의 모든 것이 객체이므로 클래스가 있다는 사실에서 비롯됩니다. 반면에 다른 모든 언어에는 객체가 아니며 클래스가없는 기본 유형 이 있습니다. 순수한 타입과 같은 것이없고 공식적으로 정의 할 방법이 없다면, 루비 세계에서 그 의미가 특히 흐릿 해집니다. Matz는 자신의 학교 이외의 특정 사고 학교를 엄격하게 준수하지 않습니다.
tadman

81

당신은 또한 시도 할 수 있습니다 : instance_of?

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

44

루비에서는 종종 객체의 클래스가 무엇인지 상관하지 않으며, 그 자체로 특정 메소드에 응답하는 것만 신경 쓰면됩니다. 이것을 오리 타이핑 이라고하며 모든 종류의 루비 코드베이스에서 볼 수 있습니다.

따라서 대부분의 경우는 아니지만 다음을 사용하여 Duck Typing을 사용하는 것이 가장 좋습니다 #respond_to?(method).

object.respond_to?(:to_i)

1
유효한 포인트. 질문에 대답하지 않지만 질문의 정신에 부딪칩니다.
user566245

@ user566245 잘 응답합니다. (: the_question), 당신이 말한 것처럼 질문에 대답하지 않고 관련 정보를 제공합니다. 답변이 질문에 답변해야합니다.
R. Rincón은

17

나는 "예"라고 말할 것입니다. "Matz"가 그의 대화 중 하나에서 이와 같이 말했듯이 "Ruby 객체에는 유형이 없습니다." 모든 것이 아니라 그가 우리를 만나려고하는 부분입니다. 그렇다면 왜 "모든 것이 대상"이라고 말했 을까요? 덧붙여서 그는 "데이터에는 객체가 아닌 타입이있다"고 말했다.

그래서 우리는 이것을 즐길 수 있습니다.

https://www.youtube.com/watch?v=1l3U1X3z0CE

그러나 루비는 클래스의 객체 유형에 크게 신경 쓰지 않습니다. 우리는 타입이 아닌 클래스를 사용합니다. 모든 데이터에는 클래스가 있습니다.

12345.class

'my string'.class

그들은 또한 조상이있을 수 있습니다

Object.ancestors

그들은 또한 메타 클래스를 가지고 있지만 그에 대한 세부 정보를 저장할 것입니다.

수업을 알고 나면 어떤 방법을 사용할 수 있는지 찾아 볼 수 있습니다. "데이터 유형"이 필요한 곳입니다. 당신이 정말로 세부 사항을 찾으려면 조회 ...

"루비 객체 모델"

Ruby가 객체를 처리하는 방법에 사용되는 용어입니다. 그것은 모두 내부적이므로 실제로 많은 것을 보지 못하지만 알아두면 좋습니다. 그러나 그것은 또 다른 주제입니다.

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

텍스트 블록 번호


예를 들어Object.ancestors # => [Object, Kernel, BasicObject]
Dorian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.