2013-01-03 115 views
0

我想了解在這個Array類的contents_support?方法中使用注入。 &運營商的目的是什麼/它是如何工作的?我認爲這是按位運算符。我發現&運營商這樣的解釋:在這種情況下使用&(&符號)是什麼意思?

可能二進制&操作最簡單的用途是在Array類。 &是集合交集操作符,這意味着結果是兩個數組中的公共元素的集合。

irb(main):001:0> [1,2,3] & [1,2,5,6] 
=> [1, 2] 

但到底是什麼,在這種情況下,如果true作爲參數傳遞給inject有些地方的對象(即局部變量items)可能不接受的信息做出響應的意思。你能解釋一下contents_support?的回報以及爲什麼&是必要的嗎?上面提到的代碼片段解釋了&在下面的代碼中考慮&的正確方法嗎?

class Array 
    def contents_support?(message)  
     self.inject(true) { |all_ok, item| all_ok = all_ok & item.respond_to?(message) }  
    end 

    def thunk(message, *args) 
     if contents_support?(message) 
     self.each { |item| args.empty? ? item.send(message) : item.send(message, args) } 
     else 
     raise "Not all contents of #{self.inspect} respond to method #{message}"  
     end 
    end 
end 

回答

0

像Ruby的大多數運營商,&過載:其行爲取決於類型的它的參數。

  • 在你的第一個片段,對&兩側的對象是Array秒。在這種情況下,&類似於交集:如果在&的兩個參數中都找到了結果Array,則只包含一個元素。
  • 在你的第二個片段中,左邊是一個布爾值。顯然,這意味着.respond_to?必須返回一個布爾值(名稱末尾的問號應該是一個提示)。在布爾值的情況下,&是邏輯連接:如果雙方都是true,則結果爲true,否則爲false
+2

謝謝,我認爲&必須&&使它成爲一個邏輯連接,但我猜這就是javascript只有 – BrainLikeADullPencil

+0

'&'是按位'和'; '&&'邏輯上是'和'。 – Zabba

+0

@Zabba:不要在Ruby中,感謝超載。 '&'只是一些二元運算符。 – 2013-01-04 00:55:23

3

東西Tinctorius沒有說。
在您的cas中,&的用法不相關,您可以使用&&。性能會更好。

a & b 

執行ab並返回其綜合作用的結果。

a && b # equals if a 
     #   return b 
     #  else 
     #   return a 
     #  end 

這意味着,它不執行b如果a是falsey。在你的情況下,如果all_ok爲假,則不需要檢查item.respond_to?(message)

順便說一下,使用all?可以簡化contents_support?(message)

def contents_support?(message) 
    self.all? { |item| item.respond_to?(message) }  
end 

既然你問,如果contents_support?(message)測試的陣列支持message這可能是一個屬性或方法的所有項目。例如:[1, 2, 3].contents_support?(:next) #=> true

相關問題