什么和& (&符号)是指在这种情况下使用?

时间:2013-01-03 23:51:51

标签: ruby operators

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

  

可能最简单地使用二进制和& operator在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

2 个答案:

答案 0 :(得分:3)

Tinctorius没有说的话 在你的cas中,&的使用不相关,你可以使用&&。对性能来说实际上会更好。

a & b

执行a AND b并返回其合并结果。

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

这意味着,如果b为假,则不会执行a 。在您的情况下,如果item.respond_to?(message)为假,则无需检查all_ok

顺便说一下,使用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

答案 1 :(得分:0)

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

  • 在您的第一个代码段中,&两侧的对象为Array个。在这种情况下,&类似于集合交集:结果Array只包含一个元素,如果它在&的两个参数中找到。
  • 在您的第二个片段中,左侧是布尔值。显然,这意味着.respond_to?必须返回一个布尔值(名称末尾的问号应该是一个提示)。如果是布尔值,&是逻辑连词:如果双方都是true,则结果为true,否则为false