代码之家  ›  专栏  ›  技术社区  ›  pilcrow

Ruby习语:谓词和条件运算符

  •  6
  • pilcrow  · 技术社区  · 14 年前

    我喜欢明智地使用三元条件运算符。在我看来,这很简洁。

    然而,在Ruby中,我发现我经常测试谓词方法,这些方法已经有了自己的问号:

    some_method( x.predicate? ? foo : bar )
    

    这两个问号离得太近了,我感到很不安。是否有一个同样紧凑和可读的替代方案?

    4 回复  |  直到 8 年前
        1
  •  9
  •   Chubas    14 年前

    你能得到的最简洁的表达方式是

    x.predicate? && foo || bar
    

    它有点像三元运算符,但更神秘和丑陋。

    这只是一个由糖引起的句法糖尿病的案例。 query? 方法。我想我们得学会忍受它。

        2
  •  12
  •   Jörg W Mittag    14 年前

    C中之所以需要条件运算符,是因为条件语句是一个语句,也就是说,它不(也不能)返回值。所以,如果你想从条件代码中返回一个值,你就走运了。这就是必须添加条件运算符的原因:它是一个表达式,即返回一个值。

    然而,在Ruby中,条件运算符是完全多余的,因为没有任何语句是Ruby。 一切 是表达式。具体来说,没有 if 在Ruby中,只有一个 如果 表达式。

    从那时起 如果 不管怎样,是一个表达式,您只需使用它而不是神秘的条件运算符:

    some_method( if x.predicate? then foo else bar end )
    

    唯一需要记住的是,谓词需要以换行符、分号或 then . 所以,前三次你这样做,你会

    if cond
      foo
    else
      bar
    end
    

    进入之内

    if cond foo else bar end
    

    想知道为什么它不起作用。但在那之后, 然后 (或分号)自然出现:

    if cond; foo else bar end
    if cond then foo else bar end
    
        3
  •  3
  •   Blake Taylor    12 年前

    只需移除空间。

    some_method( x.predicate?? foo : bar )
    

    在Ruby中同样有效。试试看!

        4
  •  1
  •   Nick Roz    8 年前

    不能说这很简单,但在许多情况下,只需将谓词本身括在括号中就可以了,如下所示:

    some_method((x.predicate?) ? foo : bar )
    

    它有帮助,尤其是当谓词不像 method?