루비에서 객체의 유형 결정
필자는 내가 찾고있는 것의 예로서 파이썬을 사용할 것이다 (파이썬을 모른다면 의사 코드로 생각할 수 있음).
>>> 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가 객체를 처리하는 방법에 사용되는 용어입니다. 그것은 모두 내부적이므로 실제로 많은 것을 보지 못하지만 알게되어 기쁩니다. 그러나 그것은 또 다른 주제입니다.
예! 클래스는 데이터 유형입니다. 객체에는 클래스가 있고 데이터에는 유형이 있습니다. 따라서 데이터베이스에 대해 알고 있다면 유한 한 유형의 세트 만 있다는 것을 알 수 있습니다.
텍스트 블록 번호
참고 URL : https://stackoverflow.com/questions/15769739/determining-type-of-an-object-in-ruby
'Programming' 카테고리의 다른 글
파이썬 / 팬더가 저장된 CSV에서 인덱스를 생성하지 않도록하는 방법은 무엇입니까? (0) | 2020.03.05 |
---|---|
객체 키 배열 가져 오기 (0) | 2020.03.05 |
gcc의 C / C ++ 소스에서 어셈블러 출력을 어떻게 얻습니까? (0) | 2020.03.05 |
Java 스트림과 정수 목록을 합산하는 방법은 무엇입니까? (0) | 2020.03.05 |
하나의 명령으로 Git 추가 및 커밋 (0) | 2020.03.05 |