Ruby如何完全面向对象?
所以,我很好奇Ruby是一种完全面向对象的语言。 我偶然发现了一个对我来说不太清楚的问题。
如果我定义一个函数如下
def foo(text) print text end
我在一个类之外定义函数,这个函数如何成为一个对象? 我意识到我可以打电话
foo.class
我得到了NilClass。 这是否意味着foo是NilClass的一个实例? 如果是的话,当我打电话时,它到底是什么意思
foo "hello world"
如果foo是一个对象,当我按上述方式进行语句时,我会调用什么方法。 此外,如果它是一个对象,这是否意味着我可以修改它并添加另一个方法(比如bar),我可以在其中制作以下语句:
foo.bar(some variables)
对不起,我在这一点上有点困惑。 非常感谢任何澄清! 谢谢!
- 用户定义的全局函数(顶级函数)是
Object
实例方法(即使self
类不是Object
)。 - 顶级方法始终是私有的。
正如维基百科所述 :
在特定对象范围之外定义的所有方法实际上都是Object类的方法。
Ruby实际上是“多范式”。 它支持面向对象,function性,命令式(以及其他一些)范例。
“完全面向对象”并不意味着你只支持面向对象的范式。 只要您支持构成面向对象编程(类,实例,多态等)的所有function,您仍然可以支持其他范例,并且仍然是“完全面向对象的”。
foo.class
首先调用方法foo
,它返回nil
,然后在foo
返回的对象上调用方法class
,即nil
。
在伪代码表示法中,逐步评估代码:
foo.class ==> { print text }.class ==> { nil }.class ==> nil.class ==> NilClass
您可以将方法作为对象。 要使用您的示例:
def foo(text) print text end
然后扩展它:
method_as_object = method(:foo) method_as_object.call('bar') #=> bar
通常,当您定义方法时,只需将其定义为当前范围的方法(默认情况下为Object类)
为了扩展Justice的例子,你可以更进一步。
def foo puts "foo" end foo.class ==> NilClass NilClass.class ==> Class Class.superclass ==> Module Module.superclass ==> Object Object.superclass ==> BasicObject
至少,Everything都是BasicObject类的一个实例。
< 班级宣言是红宝石的洗眼器吗? 一切都是面向对象的? >
下面的链接最好地解释了ruby如何完全面向对象,以便像类Someclass这样的基本结构从对象创建对象。