0

我试图了解contents_support?在这个 Array 类的方法中使用注入。操作员的目的是什么&/它是如何工作的?我认为它是按位和运算符。&我找到了运营商的这个解释:

二元 & 运算符的最简单用法可能是在 Array 类中。&是集合交集运算符,这意味着结果是两个数组中公共元素的集合。

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

但是在这种情况下这意味着什么, wheretrue作为参数传递给injectwhere 某些对象(即局部变量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
4

2 回答 2

3

丁多留斯没有说的话。
在您的案例中, 的用法&不相关,您可以使用&&. 实际上性能会更好。

a & b

执行a AND b并返回它们的组合结果。

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

这意味着,如果是假的,它就不会执行ba。在您的情况下,您不需要检查item.respond_to?(message)是否all_ok为假。

顺便说一句,contents_support?(message)使用all?.

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

既然您问过,请contents_support?(message)测试数组的所有项目是否支持message属性或方法。前任:[1, 2, 3].contents_support?(:next) #=> true

于 2013-01-04T00:34:32.507 回答
0

像 Ruby 中的大多数运算符一样,&它是重载的:它的行为取决于其参数的类型。

  • 在您的第一个片段中,两边的对象&都是Arrays。在这种情况下,&类似于集合交集:Array如果在 的两个参数中都找到了一个元素,则结果仅包含一个元素&
  • 在您的第二个片段中,左侧是一个布尔值。显然,这意味着.respond_to?必须返回一个布尔值(名称末尾的问号应该是一个提示)。在布尔值的情况下,&是逻辑合取:如果两边都是true,结果是true,否则是false
于 2013-01-04T00:12:48.967 回答