为什么 `defined?` 关键字不是 return 布尔值?

Why does `defined?` keyword not return boolean?

在ruby中,大多数以? return 布尔值结尾的方法或关键字。我们除了让他们表现得像这样。为什么 defined? 关键字 return 是别的东西?或者为什么最后会有?

"defined?"-方法可以 return 多于 "true" 或 "false"。它告诉你它是什么类型的变量,如果它被定义的话。

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

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

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

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

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

  1. 为什么不直接 return truefalse

这是因为它编码的信息比简单定义或未定义的信息更多:

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

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

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

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