为什么调用“ is_a”?方法中的“对象”是否返回“ true”?

时间:2018-09-27 19:59:11

标签: ruby methods

红宝石方法是Object。例如:

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

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

为什么方法是Object

3 个答案:

答案 0 :(得分:2)

method.is_a?(Object)

可以改写为

res = method
res.is_a?(Object)

因此,您调用一个方法并询问其结果(一个String实例)是否为Object。当然可以。

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

method.is_a?(String) # also returns true

更新

如果要检查方法本身是否为Object,可以使用以下代码段进行操作:

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实例也是Object

答案 1 :(得分:2)

就像Ilya Konyukhov写道,调用method.is_a?(Object)会检查调用method返回值,分别为"does something"nil-两者其中Object个。

Rubys方法are not objects per se,但是您可以使用Object#method方法获得它们的对象表示形式

您的特定示例的有趣之处在于,不幸的是您将测试方法命名为“方法”,从而覆盖了self的方法method

看看这个例子,我将方法命名为“ test”:

def test; end

test.class.name          => "NilClass"

method(:test).class.name => "Method"

如您所见,test正在调用该方法,之后的所有内容(例如is_a?class.name)都将在返回值< / strong>。

method(:test),但是,返回方法本身的对象表示(类别Method)。

答案 2 :(得分:1)

“ Ruby的方法不是字符串,数字和数组那样的对象”(《 Ruby编程语言》,Flanagan和Matsumoto,第176页)。 OP的方法名称“方法”很不幸;这几乎使得无法解释任何事情。如果您需要将方法视为对象,则可以使用method method,它会产生一个instance of Class Method