【问题标题】:Ruby Syntax - What is the difference between (? and if else) [duplicate]Ruby语法-(?和if else)之间有什么区别[重复]
【发布时间】:2014-07-22 17:56:46
【问题描述】:

我想知道 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 语句之间的区别。

【问题讨论】:

  • return true if 4 > 3 与您给出的以下if..else 示例不同。 return true if 4 > 3 没有else 子句,如果条件不成立,也没有return
  • 这是我给出的布尔表达式。布尔表达式只能有两个可能的值(真和假)。如果一个值为真,那么默认情况下,另一个值必须为假。这是布尔表达式中唯一可能的值。
  • 你指的是return true if 4 > 3吗?这不是布尔表达式,没有隐含的false。这行字面意思是告诉 Ruby return true 以防 4 应该大于 3。如果 4 应该小于 3,它将根本没有。
  • 我明白了。感谢您的澄清。

标签: ruby if-statement syntax conditional-operator


【解决方案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. 条件:params[:month] - 月份值 - 注意:在条件中使用时,nil 的计算结果为 false。
  3. 真值:Date.parse(params[:month]) - 将月份值解析为日期。
  4. false 值:Date.today - 如果没有日期,则使用默认值。

在更长的 ruby​​ 形式中,这基本上是这样做的(条件不一样,因为它调用了从语句中推断出的显式情况,即:最有可能触发错误情况的情况)。

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

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

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

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

【讨论】:

  • 它与我收集的带有 if else 语句的 for 块做同样的事情?
  • @user3684392:它与带有 if/else 语句的 for 块完全分开。它是一种特定类型的 if/else 结构的缩写形式,意在串联使用。
  • 对响应进行了编辑,以提供有关问题用作示例的陈述的更多详细信息。
  • 等价的if 语句应为if params[:month]
  • 在ruby中,if...else构造是表达式,而不是语句,所以这里相当于三元运算符的用法其实就是@date = if params[:month] then Date.parse(params[:month]) else Date.today end,并且它们在语义上完全等效(区别仅在于外观,而不在于行为)。那么在两者之间进行选择,纯粹是风格问题。
【解决方案2】:

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

Ruby 借用它是为了熟悉。此外,?: 表达式更简洁,但在更复杂的情况下可能会变得非常不可读,在这种情况下,可能首选 if-else 构造。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    相关资源
    最近更新 更多