2012-05-25 33 views
29

Ruby'de bir nesnenin yinelenebilir olup olmadığını nasıl kontrol ederim? nerede yöntemi içinde açıkça adlandırma sınıfların bu kısa başlayacak şekildeRuby'de bir nesnenin yinelenebilir olup olmadığını nasıl kontrol edebilirim?

def is_iterable(my_object) 
    .. 
end 

gerçekten emin değilim: is

, ben bir nesne, iterable şöyle ise temiz bir şekilde kontrol eden bir yöntem istiyorum .

Düzenleme: Amaçlarım için, yinelenebilir bir şey yapabileceğinizi söyleyelim. Bu nesne senin büyük hedefleri ve ne sonuçla yapmanız gereken bağlı olarak bunu yapmanın birçok yolu vardır

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

cevap olmadığını kontrol etmek gerek iterable değildir. –

+0

@SergioTulentsev güncellemeyi kontrol edin. – varatis

+0

Cevabımı kontrol edin :) –

cevap

40

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

sadece sorabilirsiniz. Sadece nesne #each yanıt olmadığını görmek için ördek yazarak kullanmak istiyorsanız böyle bir yöntemi varsa

  1. , o zaman sadece nesneyi sorabilirsiniz.

    my_object.respond_to? :each 
    
  2. nesne Enumerable sınıfta karıştırır eğer öğrenmek istiyorsanız, dahil edilmek üzere sınıfını kontrol edebilirsiniz.

    my_object.class.include? Enumerable 
    
  3. tüm ataları ve Mixins listesini istiyorsanız

    , sen #ancestors yöntemini istiyorum. each yöntem tanımlanır eğer

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

Bu, tüm durumlarda çalışmaz. 'nil..nil' bir Range nesnesidir ve' her 'ye yanıt verir, ancak yinelenmez ve atar' TypeError: yinelemeye çalışırken NilClass'dan yinelenemez. Ben sadece bir şey üzerinde rastgele dizeleri, vb gibi sahte kullanıcı girişlerine karşı test bir tarih aralığı girişi ile bir proje içine koştu. –

+0

Bu ilginç, bahsettiğin için teşekkürler :) –

+0

Diğer nesneler yöntemi #each olabilir, Enumerable olup olmadığını görmek için daha iyi cevap (aşağıda) olurdu. – saneshark

9

bu yöntemi varsa

+1

Neden "my_object.class.include" kullanıyorsunuz? Enumerable 'yerine my_object.is_a? Enumerable'? – dbenhur

+0

@dbenhur Semantik netlik. Sonuçlar genellikle aynıdır. –

+0

Atalara bakmak yerine şu şekilde de kontrol edebilirsiniz: 'my_object.class mbillard

1

genel durumda kontrol edebilirsiniz veya Enumerable modül nesnenin sınıfında yer alıp almadığını: Örneğin, Enumerable sınıftan devralır, sen uygulayarak herhangi my_object olup olmadığını görmek için :

my_object.class.include? Enumerable 
41

zaten bazı cevaplar var, ama burada iki yolu daha, Object#is_a?/Object#kind_of? ve Module#=== şunlardır:

each yanıt Çünkü
[].is_a? Enumerable #=> true 
    "".is_a? Enumerable #=> false 

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

iyi nokta! 432 – fl00r

1

bile bunu özellikle Range adlı unsurları "iterable" tanımla succ

def iterable?(object) 
    return object.begin.respond_to? :succ if object.kind_of? Range 
    object.respond_to? :each 
end 
İlgili konular