在Ruby中评估像Array#join这样的许多布尔表达式

ist*_*sci 14 ruby syntactic-sugar boolean-expression

在Ruby中,您可以使用Array#join将多个字符串简单地连接在一起,并使用可选的分隔符.

[ "a", "b", "c" ].join        #=> "abc"
[ "a", "b", "c" ].join("-")   #=> "a-b-c"
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一个很好的语法糖与一堆布尔表达式做类似的事情.例如,我需要&&一堆表达式.但是,将使用哪些表达式由用户输入确定.所以不要做一堆

cumulative_value &&= expression[:a] if user[:input][:a]
Run Code Online (Sandbox Code Playgroud)

我想先根据输入收集所有表达式,然后将&&它们一起全部收集起来.就像是:

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(&&)
Run Code Online (Sandbox Code Playgroud)

默认情况下Ruby中是否有这样的设备?如果可能的话,我只想要一些合成糖来使代码更清洁.

Rei*_*ard 27

试试Array#all?.如果arr是一个布尔数组,这本身是有效的:

arr.all?
Run Code Online (Sandbox Code Playgroud)

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

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

这也将工作,如果arr是一个数组Procs,只要你确保正确的变量传递给Proc#call在该块(或使用类,实例或全局变量).


Yos*_*ssi 17

你可以使用#all?,#any?#none?实现这一目标:

[true, false].any?
=> true

[true, false].all?
=> false
Run Code Online (Sandbox Code Playgroud)

并且不要忘记,除了nulfalse评估之外的所有价值观true.

['', [], {}].all?
=> true
Run Code Online (Sandbox Code Playgroud)