Ruby语法 - (?和if else)之间有什么区别

时间:2014-06-02 14:56:36

标签: ruby if-statement syntax conditional-operator

我想知道if else语法与?之间的区别?句法。我在网上看到一个例子,他们使用了问号而不是if else语句。我理解if语句只能在一行上使用

return true if 4 > 3

而不是

if 4 > 3
  return true
else
  return false
end

但是,在这种情况下,当你使用问号时我很困惑。以下是我在视频中看到的示例。

@date = params[:month] ? Date.parse(params[:month]) : Date.today

从表面上看,这似乎是if else语句的替代语法。但是,我以前从未见过它,也不知道它的作用。

我也知道方法可以以问号结尾,表明它应该返回真值或假值

def is_multiple_of_4? (x)
  return true if x % 4 == 0
end

但是,上述语法不同。我很想知道这意味着什么,以及if和else语句之间的区别。

2 个答案:

答案 0 :(得分:2)

?:是一个三元运算符,来自C,C ++和Java等语言(请参阅此处的原点 - http://en.wikipedia.org/wiki/%3F:)。

Ruby借用它来熟悉。此外,?:表达式更简洁,但在更复杂的情况下可能变得非常难以理解,在这种情况下,if-else结构可能是首选。

答案 1 :(得分:1)

这是三元运营商,长期以来一直是语言的主要内容。我相信它包含在Ruby中是为了简化开发人员从其他语言向Ruby的过渡。

它本质上是读

<condition><result if true><result if false>

它的用途主要在于那些只有两种可能的简单结果的简单条件。它将if / else块简化为一行。它不像内联if语句那样可读。

示例声明: @date = params[:month] ? Date.parse(params[:month]) : Date.today 基本上分解为赋值,条件以及真值和假值。 并有效地做到了这一点:

  1. 赋值:@date = - 将日期设置为三元语句
  2. 返回的值
  3. 条件:params[:month] - 月份值 - 注意:在条件中使用时,nil的计算结果为false。
  4. true value:Date.parse(params[:month]) - 将月份值解析为日期。
  5. false value:Date.today - 如果没有日期,则使用默认值。
  6. 在更长的形式ruby中,这基本上是这样的(条件不一样,因为它调用了从语句中推断出的明确情况,即:最有可能触发错误情况的情况)。

    if ! params[:month].nil?
      @date = Date.today
    else
      @date = Date.parse(params[:month])
    end
    

    至于您对方法名称中的问号的评论,这是一种允许开发人员区分快速返回布尔值与其他方法的方法的约定。就像以感叹号结尾的方法表示修改其调用者的方法一样。

    语法差异在方法名称和运算符之间的空格中。

    尽管大多数中缀运算符可以在没有空格的情况下使用,但在第一个和第二个运算符之间,三元运算符在第一个参数(条件)和问号之间需要一个空格,因为问号可以是一个有效的部分。方法或变量名称。