Ruby if .. elsIf .. else 在一行上?
Posted
技术标签:
【中文标题】Ruby if .. elsIf .. else 在一行上?【英文标题】:Ruby if .. elsIf .. else on a single line? 【发布时间】:2012-11-30 16:33:06 【问题描述】:使用 ruby 三元运算符,我们可以为简单的 if else 构造编写以下逻辑:
a = true ? 'a' : 'b' #=> "a"
但是如果我想写成if foo 'a' elsif bar 'b' else 'c'
呢?
我可以这样写,但是有点难以理解:
foo = true
a = foo ? 'a' : (bar ? 'b' : 'c') #=> "a"
foo = false
bar = true
a = foo ? 'a' : (bar ? 'b' : 'c') #=> "b"
是否有更好的选择来处理这种情况,或者如果我们希望将 if..elsif..else 逻辑压缩成一行,这是我们最好的选择吗?
【问题讨论】:
我认为嵌套三元解决方案缺乏可读性的问题在于,将所有这些放在一行中本来就很难阅读,而且您提出的任何解决方案都不会更容易解析。 换句话说,随着经验的积累,您将了解到将尽可能多的代码压缩到尽可能小的空间中绝不是一个有效的目标。 “将尽可能多的代码压缩到尽可能小的空间中绝不是一个有效的目标。”机器码除外。 【参考方案1】:a = (foo && "a" or bar && "b" or "c")
或
a = ("a" if foo) || ("b" if bar) || "c"
【讨论】:
感兴趣的答案,泽。这是使用or
优先级作为技巧吗?
or
和 and
的关联性低于 &&
和 ||
。
我喜欢这个...and
和 or
是朋友,只要你学习优先级,每个人都应该这样做。
如果您要返回的值是假的,这将不起作用。 irb(main):001:0> a = (false if true) || ("b" if true) => "b"
【参考方案2】:
Github Ruby Styleguide 建议为琐碎的 if/else 语句保留一个内衬,并避免嵌套三元运算符。您可以使用 then
关键字,但它被认为是不好的做法。
if foo then 'a' elsif bar then 'b' else 'c' end
如果发现您的控制语句过于复杂,您可以使用案例(ruby 的 switch 运算符)。
【讨论】:
if foo then 'a' elsif bar then 'b' else 'c'
bar 后面不需要分号
感谢您的建议,现在编辑删除它
我在c
之后忘记了end
。我们也需要添加它。【参考方案3】:
a = if foo then 'a' elsif bar then 'b' else 'c' end
【讨论】:
【参考方案4】:你也可以写:
x = if foo then 'a' elsif bar then 'b' else 'c' end
但是,这不是 Ruby 中的惯用格式。
【讨论】:
以上是关于Ruby if .. elsIf .. else 在一行上?的主要内容,如果未能解决你的问题,请参考以下文章
Oracle:控制语句 IF..ELSIF语句CASE语句FOR循环语句