一种优雅的红宝石分配方式

时间:2010-02-04 05:32:19

标签: ruby

在ruby中有更优雅的方式来做这个逻辑

a = nil #=> obviously 'a' can have value but I am just setting it nil to make the eg more clear
b = a
unless b
  b = "value"
end

这样我们最终得到b的值。我们可以有上述代码的另一种变体,如此

a = nil
b = a
b ||= "value"

我也可以使用三元语句编写上面的代码,如

b = a ? a : "value"

但如果你用一长串代码替换变量a和“value”,那么这个三元语句也将开始看起来很难看。

上述逻辑可以以某种方式变得更优雅/更具表现力,还是仅限于上述解决方案?

3 个答案:

答案 0 :(得分:10)

你几乎自己回答了你的问题。

b = a
b ||= "value"

可以缩短为

b = a || "value"

答案 1 :(得分:2)

b ||= "value"与Perl广受欢迎的////=运算符非常相似,因为在Ruby中,唯一检测错误的是nil(以及,false 1}})。这使它在功能上与Perl的//=运算符完全相同。你能比a ||= b获得多少“优雅”?老实说,我不知道除了让操作员更短(并且那时你只是愚蠢)之外,这个想法可以传达得多么紧凑。

答案 2 :(得分:1)

我不喜欢使用||运营商因为Farrel在ib的回答中指出了这一点。它可能就在这里,但我总是害怕它会让我有一天绊倒我。所以我担心我倾向于选择相当行人:

b = "value"; b = a unless a == nil

不是很漂亮,我知道,但非常安全,非常非常明确。