2011-11-19 58 views
0

我有以下代碼:零V/S空的紅寶石

if([email protected]?) then 
      logger.info ("Storing in recent search") 
      logger.info(@stores.nil?) 
      logger.info(@stores.empty?) 
      logger.info(@stores) 
      recentsearch = Recentsearch.create({:query => ss, :type=>tt, :ts=>Time.now}) 
      recentsearch.save 
end 

所以,如果@storesnil,則if-end應該不會執行。但奇怪的是(對我來說)它確實如此。在日誌中,我看到以下內容:

Storing in recent search 
nil 
true 
[] 

這怎麼可能?

+0

我很驚訝日誌中的'nil' - 'nil.nil?'返回'true',其他的都返回'false'。那麼,'nil'從哪裏來? – sarnold

+1

只是一個提示,在紅寶石是第一線一般會除非@ stores.nil寫'?',如果我知道,某種名單被繞過我傾向於使用'除非@ stores.nil? || @ stores.empty?',因爲它處理列表中的兩個「空」情況。 – iain

+0

請注意,ActiveSupport的'Object#blank?'和'Object#present?'在兩種情況下均可用。它們的行爲更像PHP的'empty()',它是一個「無?」和「空?」檢查的組合。 – d11wtq

回答

2

顯然@stores不是nil但初始化爲空數組[]。由於@stores.nil?爲假,因此[email protected]?是真的。我不熟悉logger.info,所以我不確定它爲什麼會在第三行打印nil。如果數組中沒有元素,則empty?返回true。

1

第一行的條件是:if [email protected]? - 如果商店不是零。因此,@stores.nil?行不能爲true。事實上,它沒有,它顯示nil,這是(更多)false。意思是@stores不是零。該陣列是空的,但它是存在的,所以一切都好了。

nil表示沒有對象。空數組仍然是一個對象。