0

如果我有多个 || 我想在 Ruby 中链接的逻辑运算符,有没有比这更好的方法来编写它:

if (((a == 1 || a == 9) || a % 5 == 0) || ... )

这似乎非常重复和不干净。

4

4 回答 4

6

如果您只有 OR,则不需要括号...

(a == 1 || a == 9 || a % 5 == 0)

稍微清理一下。

Ruby 是一门有趣的语言。可能有很多聪明的方法可以让你以一种不那么重复的方式表达相同的意图。我只是警告不要偏爱简洁而不是清晰。

include?如果您真的只是在列表中寻找匹配项,这将是合适的。但是如果这不是最合适的表达方式,请不要保存几个字符。

于 2013-10-02T23:27:46.777 回答
4

您可以将布尔语句放入一个数组并调用 #any? 在上面:

if [a == 1, a == 9, a % 5 == 0, ...].any?

这可能看起来更具可读性,但这肯定取决于您的用例。

于 2013-10-03T01:59:19.490 回答
1

整个声明是什么?

例如,如果条件的主体是单个语句,则不需要任何括号:

puts 'hi' if a & ~8 == 1 || a % 5 == 0

如果您正在寻找将数学比较压缩为简短内容的方法(例如 a & ~8 == 1,与 a == 1 || a == 9 相同),请发布整个内容。SO上的一些人喜欢这种东西。:)

于 2013-10-02T23:57:02.127 回答
0

如果你有很多||'s,

t = [" == 1", " == 9", "%5==0"] or
t = %w[==1  ==9  %5==0] # No spaces other than separators! or
t = "==1  ==9  %5==0".split # Ditto! or
t = "== 1, == 9, %5==0".split(',')

然后

t.inject (false) {|r, s| r || eval('a'+s) }  

如果你有很多很多的,你可以在ing||之前做这样的事情:inject

assignments = [1, 2, 5, ":cat", "dog",...]
other = "%5==0, & 8,...".split(',')
t = assignments.map {|e| "=="+e.to_s} + other
于 2013-10-03T02:39:21.547 回答