我试图理解在这个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
答案 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
。