2011-12-12 52 views
1

的名單我有一個#任何很奇怪的問題?對只有nil對象的數組打印true。無法獲取Ruby的#any?返回false與零對象

背景:這是模型中的所有參與 - 我在數組中有記錄列表,我數組的元素設置爲零如果索引項符合一定規則。因爲我沒有得到我期待的結果(編寫測試),所以我在一些調試中遇到了問題。

logger.debug "SIZE #{my_event_type_time_units.size}" 
logger.debug "CLASS #{my_event_type_time_units.class}" 
my_event_type_time_units.each { |r| logger.debug "#{r.class}" } 
logger.debug "ANY? #{my_event_type_time_units.any?}" 

輸出

SIZE 3 
CLASS Array 
NilClass 
NilClass 
NilClass 
ANY? true 

順便說一句,當我嘗試了沒有?帶有一個無對象列表,它返回false。

[nil, nil, nil].any? ## false 

誰能告訴我我做錯了什麼。這是我第一次使用#any?但它不能那麼難。它可以?

any? will return true if at least one of the collection members is not false or nil 
+0

究竟是你設置爲零?你能告訴我們代碼嗎? – maprihoda

+0

你的對象與[[nil,nil,nil]'有什麼不同?你如何構建它?當你使用logger.debug my_event_type_time_units.inspect時會發生什麼? –

+0

好了,由兩個反應來看,我認爲原因是:因爲我回來的AR記錄列表,數組是不是一個簡單的數組(這是一個協會)和我使用Rails的#任何?方法,而不是Ruby的。當我嘗試[無,零,無] .any的例子?正在研究Ruby Array類並使用Ruby的#any?方法。 Google發現這很難,但會繼續這樣做,因爲這需要了解。爲什麼有兩個?方法有點奇怪和混亂。 – ants

回答

1

您正在尋找Ruby的實施any?,而不是Rails的。請記住,Rails關聯(特別是Arel關聯)不是實際的陣列......它們比這更復雜。你從模型返回的任何東西都是一個關聯,而不是一個數組。 Rails的猴子補丁的東西,使他們的行爲像普通Ruby對象(例如具有.class返回Array,但事實並非總是如此,這裏的鐵路對any?代碼:

# activerecord/lib/active_record/associations/collection_association.rb, line 268 
def any? 
    if block_given? 
    load_target.any? { |*block_args| yield(*block_args) } 
    else 
    !empty? 
    end 
end 

下面是Ruby的:

static VALUE 
enum_any(VALUE obj) 
{ 
    VALUE result = Qfalse; 

    rb_block_call(obj, id_each, 0, 0, ENUMFUNC(any), (VALUE)&result); 
    return result; 
} 

他們的行爲有所不同

我不確定你在努力完成什麼,但我懷疑any?不是正確的方法,我會建議看看include?甚至compact ...

+0

感謝您的解釋。有兩個#any?方法充其量是令人困惑的。我們在哪裏找到已在Rails中重新實現的方法?谷歌搜索沒有太多嘔吐。 – ants

+0

apidock.com是一個很好的開始... – sethvargo

+0

答案有點誤導,因爲它表明有兩種相同方法的實現。那麼,這些方法不同於它們屬於不同類的方法,並且有兩個類以不同的方式實現方法是完全正常的。在初讀時,我甚至(誤)都明白Rails實際上是猴子修補的'Array#any?'(或者它是Enumerable#any?'),這確實很可怕。 –

3

不確定您使用的是哪個版本的Rails,但是在< 3.1; any?是這樣的:

def any? 
    if block_given? 
     method_missing(:any?) { |*block_args| yield(*block_args) } 
    else 
     !empty? 
    end 
    end 

記住:Rails關聯不是真正的數組。

+0

你爲什麼要談論Rails版本? #任何?是Ruby,而不是Rails(AFAIK)。 Rails關聯與它有什麼關係,因爲我只是在處理一個具有3個NilClass對象的數組。或者我錯過了什麼。 – ants

+0

@ants正因爲我說的原因。你說這是一個模型中的記錄列表。對我而言,這意味着它是一種關聯。 Rails關聯不是*數組,它們是Rails關聯,並且有不同的'any?'實現 - 我發佈的那個。這是唯一可能導致你看到的行爲。 –

+0

是的,我現在看到了,但您的初步答案非常簡短,並沒有告訴我爲什麼。由於這兩個答案,我現在可以看到發生了什麼。你說什麼是有道理的,AR將返回關聯的實例而不是零記錄。但正如我在OP中所說的,這實際上是我第一次使用#any?並沒有得到我預期的結果。我正在玩「返回數組」(填充零對象),但該數組仍然是一個關聯,而不是一個正常的數組。我從四個字符(任何?)中學到了很多東西。你的回覆。 – ants