【问题标题】:Ruby - Question Mark usage in Class MethodRuby - 类方法中的问号用法
【发布时间】:2020-11-15 16:33:31
【问题描述】:

我在理解下面的初始化和颜色方法时有点困难。这是来自给我的解决方案:

正在初始化的那个: 我认为这意味着@given等于value,如果value等于0,则为false,否则为true

在颜色下不确定第二个问号是什么意思。

def initialize(value)
  @value = value
  @given = value == 0 ? false : true
end

def color
  given? ? :blue : :red
end

def given?
  @given
end

【问题讨论】:

    标签: ruby class conditional-operator


    【解决方案1】:

    在颜色下不确定第二个问号是什么意思。

    这称为条件运算符。 (例如,参见the ISO Ruby Language Specification 的第 11.5.2.2.5 节 条件运算符表达式。)

    condition ? consequence_truthy : consequence_falsy
    

    将评估condition,并根据结果是真还是假,将评估第一个或第二个结果。

    就我个人而言,我发现条件运算符在 Ruby 中毫无用处。在 C 和类似语言中,条件运算符是必需的,因为它是一个表达式,而条件语句是一个语句。所以,如果需要在表达式中使用条件,就不能使用条件语句,必须使用条件运算符。

    然而,这不适用于 Ruby:在 Ruby 中,一切都已经是一个表达式,没有语句。条件表达式(例如,参见第 11.5.2.2.2 节 if 表达式、第 11.5.2.2.3 节 unless 表达式和第 11.5 节.2.2.4 case 表达式) 已经可以作为表达式使用,所以不需要使用条件运算符。

    就个人而言,我发现条件表达式比条件运算符更具可读性:

    if condition then consequence_truthy else consequence_falsy end
    

    这在语义上等同于条件运算符,唯一的区别是语法:它具有不同的优先级,但实际上比条件运算符的优先级更自然。

    所以,在我看来,你的例子可以写得更清楚

    def initialize(value)
      @value = value
      @given = if value == 0 then false else true end
    end
    
    def color
      if given? then :blue else :red end
    end
    

    实际上,initialize 包含一个无用的使用条件,因为Integer#== 已经 返回一个布尔值。因此,以下内容会更加清晰:

    def initialize(value)
      @value = value
      @given = value != 0
    end
    

    【讨论】:

      【解决方案2】:

      我们主要使用 ?标记为返回布尔值的方法名称的一部分。这只是我们 ruby​​ 编码人员遵循的约定。

      在你给出的例子中?是方法名称,因为它返回布尔值,所以这里我们遵循约定。

      在三元条件运算符中我们使用

      condition ? do something when condition is true : do something when condition is false
      

      在你的情况下 给?它返回真或假,这也是方法名称

      所以第一个问号是方法名的一部分,第二个问号是三元条件的一部分

      【讨论】:

        猜你喜欢
        • 2012-12-09
        • 1970-01-01
        • 2015-03-12
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 2015-02-23
        • 1970-01-01
        • 2021-09-05
        相关资源
        最近更新 更多