红宝石方法是Object
。例如:
def method
'does something'
end
method.is_a? Object #=> true
def method; end
method.is_a? Object #=> true
为什么方法是Object
?
答案 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。