【问题标题】:Simulate ternary operator in Elixir在 Elixir 中模拟三元运算符
【发布时间】:2024-01-22 02:01:01
【问题描述】:

在Elixir中如何做类似的条件单行检查?

if (x > 0) ? x : nil

这是灵药界唯一的等价物吗?

if true, do: 1, else: 2

【问题讨论】:

    标签: elixir conditional-operator


    【解决方案1】:

    对我来说,if IS 相当于一个三元运算符,因为它计算出的值对于其他各种语言都没有。

    所以x = if false, do: 1, else: 2

    基本上是x = false? 1 : 2

    不确定为什么 Ruby 采用它(如果您来自 Ruby),因为它具有可赋值的 if 语句。在 C 中,三元是有用的,因为代码膨胀与等效的 if 语句。当然,渴望简洁的 C 程序员发疯了,并且做了许多嵌套在嵌套三元组上的操作:)

    【讨论】:

      【解决方案2】:

      是的,Elixir 中没有三元运算符。 if 的关键字版本可能是最接近的:

      if condition, do: true_expr, else: false_expr
      

      【讨论】:

        【解决方案3】:

        我在tweet 中看到了这个替代方案,

        is_it_true && "TRUE" || "FALSE"
        

        【讨论】:

        • 请注意,这有一个主要问题:is_it_true && false || :foobar 将始终返回 :foobar 而永远不会返回 false。这是因为对于 x 的任何值,x && false 将始终计算为一个虚假值,而对于 x 的任何值,false || x 将始终计算为 x。如果您使用的是 nil 而不是 false,则同样的问题也适用。
        • a = true && 1 || 2,如果你的结构很好,我看不到这里的问题。
        • a = argument_received && argument || default_value 如果你确实收到了参数,但它恰好是一个错误,你的程序将忽略它,这可能不是你想要的,所以......肯定有一个陷阱。
        【解决方案4】:

        一个未提及且更冗长的替代方案是

        case condition do true -> true_expr; _ -> false_expr end
        

        【讨论】:

        • 这将被格式化为使用 4 行并失去真实性/虚假性