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这样的基本结构从对象创建对象。