ケース ステートメントの条件はすべて同じ形式に従います。これは、一部の繰り返しを排除し、ポリシーを実装から分離する機会があることを示唆しています。ポリシーは、リンクを非表示にする一連の条件です。
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']
どれか?
Enumerable#any? 配列の各要素をブロック (do
との間のビットend
) に渡します。ブロックがtrueyを返す場合、 の結果any?
は true です。それ以外の場合、値any?
は false です。
配列分解
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 は配列をパーツに分解してくれます。これを行う1つの方法は次のとおりです。
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|
...
これは、前の 2 つのフラグメントのいずれかと同等です。