2012-05-25 2 views
29

루비에서 객체가 반복 가능한지 어떻게 확인합니까? 여기서 메소드 내에서 명시 적으로 명명 클래스의이 짧은에 시작Ruby에서 객체가 반복 가능한지 확인하는 방법은 무엇입니까?

def is_iterable(my_object) 
    .. 
end 

난 정말 모르겠어요 :이다

, 나는 객체가 반복 가능한과 같이 경우 깨끗하게 확인하는 방법을 원한다 .

편집 : 제 생각에는 iterable은 할 수있는 일입니다. 이 객체는 당신의 더 큰 목표와 당신이 결과와 함께 할 필요에 따라이 작업을 수행하는 여러 가지 방법이 있습니다

def iterable?(object) 
    object.respond_to? :each 
end 
+2

에 응답하는지 확인해야합니다 반복자되지 않습니다. –

+0

@SergioTulentsev 업데이트를 확인하십시오. – varatis

+0

내 대답을 확인하십시오 :) –

답변

40

For my purposes, let's say iterable is something you can do .each to.

당신은 요청할 수 있습니다. 그냥 객체가 #each에 응답 있는지 확인하기 위해 오리 입력을 사용하고자하는 경우는 이러한 방법이있는 경우

  1. 는, 당신은 단지 객체를 요청할 수 있습니다.

    my_object.respond_to? :each 
    
  2. 개체가 Enumerable에서 클래스의 혼합 여부를 알아 싶은 경우에, 당신이 포함의 클래스를 확인할 수 있습니다.

    my_object.class.include? Enumerable 
    
  3. 모든 조상과 유지 mixin의 목록을 원하는 경우

    , 당신은 #ancestors 방법을 원한다. each 메소드가 정의되어있는 경우

    my_object = [] 
    my_object.class.ancestors 
    => [Array, Enumerable, Object, PP::ObjectMixin, Kernel, BasicObject] 
    
    my_object.class.ancestors.include? Enumerable 
    => true 
    
+8

모든 경우에 이것이 작동하는 것은 아닙니다. 'nil..nil'은 Range 객체이며'each'에 응답하지만 iterable이 아니며'TypeError : NilClass에서 반복 할 수 없습니다 '를 반복합니다. 방금 입력 한 날짜 범위 입력이있는 프로젝트에서 아무 것도 또는 임의의 문자열과 같은 가짜 사용자 항목에 대해 테스트했습니다. –

+0

흥미 롭습니다, 언급 해 주셔서 감사합니다 :) –

+0

다른 개체는 #each 메서드를 가질 수 있습니다. 아래의 더 좋은 대답은 Enumerable인지 확인하는 것입니다. – saneshark

9

이 방법이있는 경우

+1

왜 my_object.class.include를 사용합니까? 'my_object.is_a 대신 Enumerable'을 사용합니까? 열거 형'? – dbenhur

+0

@dbenhur 의미 적 명확성. 결과는 일반적으로 동일합니다. –

+0

조상을 보는 대신 다음과 같이 확인할 수 있습니다 :'my_object.class mbillard

1

은 일반적인 경우에 확인할 수 있으며, Enumerable 모듈은 객체의 클래스에 포함되어있는 경우 예를 들어, Enumerable에서 클래스 상속, 당신은 호출 할 수 my_object 여부를 확인합니다 :

my_object.class.include? Enumerable 
41

당신은 이미 몇 가지 답변을 가지고 있지만, 여기에 두 더 많은 방법, Object#is_a?/Object#kind_of?Module#===은 다음과 같습니다

Rangeeach에 응답하기 때문에
[].is_a? Enumerable #=> true 
    "".is_a? Enumerable #=> false 

    Enumerable === [] #=> true 
    Enumerable === "" #=> false 
+0

좋은 지적! 432 – fl00r

1

경우에도 당신이 구체적으로 범위의 요소를 "반복 가능한"정의 succ

def iterable?(object) 
    return object.begin.respond_to? :succ if object.kind_of? Range 
    object.respond_to? :each 
end 
관련 문제