[ruby] 루비에서 객체의 유형 결정

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

>>> 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)문제의 객체가 원하는 것을 수행하는지 테스트하는 더 좋은 방법입니다.


답변

당신은 또한 시도 할 수 있습니다 : 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가 객체를 처리하는 방법에 사용되는 용어입니다. 그것은 모두 내부적이므로 실제로 많은 것을 보지 못하지만 알아두면 좋습니다. 그러나 그것은 또 다른 주제입니다.

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

텍스트 블록 번호


답변