所以,我很好奇Ruby是一种完全面向对象的语言。我偶然发现了一个对我来说不太清楚的问题。
如果我定义一个函数如下
def foo(text)
print text
end
我定义了一个类之外的函数,这个函数如何成为一个对象?我意识到我可以打电话了
foo.class
我得到了NilClass。这是否意味着foo是NilClass的一个实例?如果是的话,当我打电话时,它究竟意味着什么呢?
foo "hello world"
如果foo是一个对象,当我按上述方式进行语句时,我会调用哪种方法。此外,如果它是一个对象,这是否意味着我可以修改它并添加另一个方法(比如bar),我可以在其中制作以下语句:
foo.bar(some variables)
对不起,我在这一点上有点困惑。非常感谢任何澄清!谢谢!
答案 0 :(得分:12)
Object
的实例方法(即使self
的类不是Object
)。答案 1 :(得分:11)
在特定对象范围之外定义的所有方法实际上都是Object类的方法。
Ruby实际上是“多范式”。它支持面向对象,功能性,命令式(以及其他一些)范例。
“完全面向对象”并不意味着仅支持面向对象的范例。只要您支持构成面向对象编程(类,实例,多态等)的所有功能,您仍然可以支持其他范例,并且仍然是“完全面向对象的”。
答案 2 :(得分:7)
foo.class
首先调用返回foo
的方法nil
,然后调用class
返回的对象上的方法foo
,即{{} 1}}。
在伪代码表示法中,逐步评估代码:
nil
答案 3 :(得分:2)
您可以将方法作为对象。要使用您的示例:
def foo(text)
print text
end
然后扩展它:
method_as_object = method(:foo)
method_as_object.call('bar') #=> bar
通常,在定义方法时,只需将其定义为当前范围的方法(默认情况下为Object类)
答案 4 :(得分:0)
为了扩展Justice的例子,你可以更进一步。
def foo
puts "foo"
end
foo.class
==> NilClass
NilClass.class
==> Class
Class.superclass
==> Module
Module.superclass
==> Object
Object.superclass
==> BasicObject
所有东西至少都是BasicObject类的一个实例。
答案 5 :(得分:0)
< Is Class declaration an eyewash in ruby? Is everything really object oriented?>
以下链接最能说明ruby如何完全面向对象,以便类Someclass等基本结构从对象创建对象。