17

Rubyでは、Array#joinを使用して、オプションの区切り文字を使用して複数の文字列を単純に結合できます。

[ "a", "b", "c" ].join        #=> "abc"
[ "a", "b", "c" ].join("-")   #=> "a-b-c"

ブール式の束と同様のことを行うための優れた構文糖衣があるかどうか疑問に思います。たとえば&&、たくさんの表現を一緒にする必要があります。ただし、使用する式はユーザー入力によって決まります。だから、たくさんする代わりに

cumulative_value &&= expression[:a] if user[:input][:a]

最初に入力に基づいてすべての式を収集し、次に&&それらをすべてまとめて一挙に収集したいと思います。何かのようなもの:

be1 = x > y
be2 = Proc.new {|string, regex| string =~ regex}
be3 = z < 5 && my_object.is_valid?
[be1,be2.call("abc",/*bc/),be3].eval_join(&&)

デフォルトでRubyにそのようなデバイスはありますか?可能であれば、コードをよりクリーンにするために、シンタティックシュガーが必要です。

4

3 に答える 3

31

試してみてくださいArray#all?。がブール値の配列の場合arr、これは単独で機能します。

arr.all?

trueのすべての要素arrが true の場合、またはそうでない場合に返されfalseます。

Array#any?で配列を結合する場合と同じ方法で使用できます。つまり、配列内のいずれかの要素が true の場合は||返され、そうでない場合は返されます。truefalse

これarrは、 が の配列である場合にも機能Procsしますが、ブロック内で正しい変数を に渡すProc#call(またはクラス、インスタンス、またはグローバル変数を使用する) ことを確認する必要があります。

于 2013-01-14T22:55:01.667 に答える
19

#all?#any?およびを使用して、#none?これを実現できます。

[true, false].any?
=> true

[true, false].all?
=> false

nulそして、 と 以外のすべての値がにfalse評価されることを忘れないでくださいtrue

['', [], {}].all?
=> true
于 2013-01-14T22:55:22.073 に答える
2

この特定のケースでは、ユーザーが選択した式のハッシュで式のハッシュをフィルター処理し、それらの式がすべて正しいかどうかをテストします。

cumulative_value = expression.select {|k, v| user[:input][k] }.values.all?

これにより、最初に一致するuser[:input]キーがある式からすべてのメンバーが選択され、次にArray#all?、選択された式のすべての値が真であるかどうかがテストされます。その場合、あなたcumulative_valueは真か偽のどちらかです。

式の値はprocである可能性があるため、フィルター処理された式リストからすべてのprocを評価し、そこから結果配列を作成する必要があります。これを呼び出すことができますall?

cumulative_value = expression.select {|k, v| user[:input][k] }.
  values.map {|value| value.is_a?(Proc) ? value.call : value }.all?

「シンタックスシュガー」はほとんどありませんが、ひどく複雑になることなく仕事をこなすことができます。

于 2013-01-14T23:09:07.853 に答える