【问题标题】:Why does `defined?` keyword not return boolean? [duplicate]为什么 `defined?` 关键字不返回布尔值? [复制]
【发布时间】:2015-11-23 01:15:52
【问题描述】:

在 ruby​​ 中,大多数以 ? 结尾的方法或关键字都返回布尔值。我们除了他们这样行事。为什么defined? 关键字会返回其他内容?或者为什么末尾有?

【问题讨论】:

    标签: ruby conventions defined


    【解决方案1】:

    “定义?”方法可以返回多个“真”或“假”。它告诉你它是什么类型的变量,如果它被定义的话。

    检查 Checking if a variable is defined?http://ruby-doc.org/docs/keywords/1.9/Object.html#method-i-defined-3F

    【讨论】:

    • 这不是答案。问题是为什么会这样。
    【解决方案2】:

    开发人员选择返回比truefalse 更有意义的东西,因为唯一不返回布尔值的情况是显式比较:

    defined?(:x) == true
    # => always `false`
    

    这种比较通常是你不应该做的,因为像||&&这样的逻辑运算符很可能返回一些真实的对象而不是true。这几乎不需要任何东西。

    【讨论】:

      【解决方案3】:

      这个问题可以从两个方面来理解:

      1. 为什么不直接返回truefalse

      这是因为它编码的信息比简单地是否定义了更多信息:

      defined? Class # => "constant"
      defined? 42    # => "expression"
      defined? nil   # => "nil"
      defined? x     # => nil
      
      1. 为什么它的末尾有?,因为按照惯例,问号是为谓词保留的?

      你是对的,这是不一致的。最可能的原因是:

      • 几乎总是,无论如何你都会使用它作为谓词

        if defined? x
          # do something
        end
        
      • 最短的替代方案是definition_type_of,这听起来不像是我能想到的谓词。通常,您希望保留您的语言中的保留字简短

      【讨论】:

      • 对我来说,defined? 周围真正的 wtf 部分一直是为什么它返回字符串而不是符号?。我绝对没有好的答案......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 2017-02-08
      • 2013-02-24
      相关资源
      最近更新 更多