【问题标题】:Ruby: One-Line If-Then-Else [duplicate]Ruby:单行 If-Then-Else [重复]
【发布时间】:2017-04-22 01:20:20
【问题描述】:

我想知道 Ruby 中是否有一种方法可以使用单词作为运算符编写单行 if-then-else 语句,其方式类似于 python 的

a if b else c

我知道经典的三元条件,但我觉得 Ruby 更像是一种“文字”语言而不是“符号”语言,所以我试图更好地封装语言的精神。

我也知道这种方法,

if a then b else c end

这基本上是将多行压缩到一条线上,但行尾的end 感觉既麻烦又多余。我认为三元条件会比这个更可取。

那么对于熟悉 Ruby 的你来说,有没有更好的写法呢?如果不是,哪种方法最 Rubyesque?


链接帖子未解决以下问题:

  1. 有没有比if a then b else c end 更简洁的方法来用Ruby 编写“wordsey”单行if-then-else?
  2. 三元条件版本还是 wordey 版本更适合 Ruby 范例?

【问题讨论】:

  • @Apollys 因为我不确定,所以我没有投票反对或投票结束。如果我这样做,我会明确地说出来。该链接只是一个建议。要么接受,要么离开。
  • @Carcigenicate 好的,那么巧合的时间,我很抱歉,先生。在发布此之前,我确实阅读了该主题。 (但请注意,我写的是“我知道经典的三元条件...”)
  • 重复的确实回答了您的问题,包括链接到样式指南的答案。

标签: ruby syntax


【解决方案1】:

存在的两个单衬就是您已经描述的两个:

三元:

a ? b : c

如果结构:

if a then b else c end

所以回答你的问题:

  1. 没有。
  2. 根据thisthis,首选三元, 而根据thisthis,if-struct 是首选。 Ruby 没有官方的风格指南,恐怕你找不到具体的答案。就个人而言,我使用 if-struct,因为它可以减少认知负担,如果更冗长的话。

然而,大多数风格指南都说三元运算符适用于简单的构造:

Avoid the ternary operator (?:) except in cases where all expressions are extremely trivial.

【讨论】:

    【解决方案2】:

    Ruby 非常灵活,通常用于创建领域特定语言 (DSL),虽然此示例不是真正的 DSL,但您可以使用它在对象类上创建更具表现力的三元方法。

    def the_value(val, as_long_as:, otherwise:)
      as_long_as ? val : otherwise
    end
    
    some_thing = the_value 4, as_long_as: 1 > 0, otherwise: 5
    => 4
    some_thing = the_value 4, as_long_as: 1 < 0, otherwise: 5
    => 5
    

    您可以更改方法名称和参数以适应您喜欢的任何上下文。

    ps:这里假设 ruby​​ 版本 >= 2.1

    【讨论】: