语法糖-评估许多布尔表达式,如Ruby中的Array#join



在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中默认有这样的设备吗?如果可能的话,我只想要一些语法糖来让代码更干净。

尝试Array#all?。如果arr是布尔值数组,它本身就起作用:

arr.all?

如果arr中的每个元素都为真,则返回true,否则返回false

您可以使用与||上连接数组相同的方式使用Array#any?,也就是说,如果数组中的任何元素为true,则返回true,否则返回false

如果arrProcs的数组,只要您确保将正确的变量传递给块中的Proc#call(或使用类、实例或全局变量(,这也会起作用。

您可以使用#all?#any?#none?来实现这一点:

[true, false].any?
=> true
[true, false].all?
=> false

别忘了,除了nulfalse之外的所有值的求值结果都是true

['', [], {}].all?
=> true

在这种特殊情况下,您只需要根据用户选择的表达式筛选表达式哈希,然后测试所有这些表达式是否都是真的:

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?

虽然算不上"句法糖",但它完成任务时不会非常复杂。

最新更新