案例陈述中的条件都遵循相同的形式,这表明有机会消除一些重复,并将政策与实施分开。策略是应隐藏链接的一组条件:
WHEN_TO_HIDE_LINK = [
['edit', %w(sent sending archived)],
['send_schedule', %w(sent sending archived)],
['archive', %w(archived)],
['dashboard', %w(sending draft)],
]
实现是应用策略的代码:
def hide_link?(link, mailing)
WHEN_TO_HIDE_LINK.any? do |link_value, mailing_statuses|
link_value == link && mailing_statuses.include?(mailing.status)
end
end
首屏下方的解释。
%w
%w 是一种无需输入所有引号和逗号即可指定字符串列表的方法。这:
%w(sent sending archived)
相当于:
['sent', 'sending', 'archived']
任何?
可枚举#any? 将数组的每个元素传递给块(介于do
和之间的位end
)。如果块曾经返回truthy,那么结果any?
为真;否则, 的值为any?
假。
数组分解
你有没有注意到,虽然 的每个元素WHEN_TO_HIDE_LINK
都是一个数组,但传递给的块any?
却没有一个数组?您可能希望您必须这样做:
WHEN_TO_HIDE_LINK.any? do |when_to_hide|
link_value = when_to_hide[0]
mailing_statuses = when_to_hide[1]
...
但是 Ruby 会为你分解数组。这是一种方法:
WHEN_TO_HIDE_LINK.any? do |when_to_hide|
link_value, mailing_statuses = when_to_hide
...
当右侧有一个数组,左侧有=
逗号分隔的变量时,Ruby 会将数组分解为其元素,并将它们分别分配给变量。
但是 Ruby 可以让事情变得更简单:
WHEN_TO_HIDE_LINK.any? do |link_value, mailing_statuses|
...
这相当于前面两个片段中的任何一个。