代码之家  ›  专栏  ›  技术社区  ›  Gabriel Mesquita

为什么叫“是你”?方法上的“对象”返回“true”?

  •  0
  • Gabriel Mesquita  · 技术社区  · 6 年前

    Object . 例如:

    def method
      'does something'
    end
    method.is_a? Object #=> true
    
    def method; end 
    method.is_a? Object #=> true
    

    对象 ?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Alexander Presber    6 年前

    就像Ilya Konyukhov写的 method.is_a?(Object) 返回值 电话号码 method ,也就是 "does something" nil 分别是-都是 Object s。

    Rubys方法 are not objects per se 但是你可以得到一个 Object#method

    您的特定示例中有趣的部分是,您不幸地将您的测试方法命名为“method”,从而覆盖了 self s法 方法

    def test; end
    
    test.class.name          => "NilClass"
    
    method(:test).class.name => "Method"
    

    如你所见, test 打电话 is_a? class.name 返回值 .

    method(:test) Method )方法本身。

        2
  •  2
  •   Ilya Konyukhov    6 年前

    method.is_a?(Object)

    可以重写为

    res = method
    res.is_a?(Object)
    

    String 实例--是一个 Object . 当然是的。

    可通过以下方式轻松验证:

    method.is_a?(String) # also returns true
    

    更新

    如果要检查方法本身是否 或者不可以,您可以使用以下代码段:

    def method2
      "some string"
    end
    
    method2_ref = Object.method(:method2) # #<Method: Object.method2>
    method2_ref.is_a? Object # true
    method2_ref.is_a? String # false
    

    正如评论中提到的, Method 实例也是一个 对象

        3
  •  1
  •   steenslag    6 年前

    “Ruby的方法不像字符串、数字和数组那样是对象”(Ruby编程语言,Flanagan和Matsumoto,第176页)。OP的方法名“method”是不幸的;这使我们几乎无法解释任何事情。如果需要将方法视为对象,那么 method method ,这将导致 instance of Class Method .