Ruby如何完全面向对象?

10 ruby oop

所以,我很好奇Ruby是一种完全面向对象的语言.我偶然发现了一个对我来说不太清楚的问题.

如果我定义一个函数如下

def foo(text)
  print text
end
Run Code Online (Sandbox Code Playgroud)

我在一个类之外定义函数,这个函数如何成为一个对象?我意识到我可以打电话

foo.class
Run Code Online (Sandbox Code Playgroud)

我得到了NilClass.这是否意味着foo是NilClass的一个实例?如果是的话,当我打电话时,它究竟意味着什么

foo "hello world"
Run Code Online (Sandbox Code Playgroud)

如果foo是一个对象,当我按上述方式进行语句时,我会调用什么方法.此外,如果它是一个对象,这是否意味着我可以修改它并添加另一个方法(比如bar),我可以在其中制作以下语句:

foo.bar(some variables)
Run Code Online (Sandbox Code Playgroud)

对不起,我在这一点上有点困惑.非常感谢任何澄清!谢谢!

kia*_*uno 12

  • 用户定义的全局函数(顶级函数)是实例方法Object(即使类self不是Object).
  • 顶级方法始终是私有的.

  • 好的,这是有道理的.因此,函数不是对象,而是Object类的私有方法.谢谢! (2认同)

Dea*_*ing 11

正如维基百科所述:

在特定对象范围之外定义的所有方法实际上都是Object类的方法.

Ruby实际上是"多范式".它支持面向对象,功能性,命令式(以及其他一些)范例.

"完全面向对象"并不意味着你支持面向对象的范式.只要您支持构成面向对象编程(类,实例,多态等)的所有功能,您仍然可以支持其他范例,并且仍然是"完全面向对象的".


yfe*_*lum 7

foo.class首先调用foo返回的方法,nil然后调用class返回的对象的方法foo,即nil.

在伪代码表示法中,逐步评估代码:

foo.class
==> { print text }.class
==> { nil }.class
==> nil.class
==> NilClass
Run Code Online (Sandbox Code Playgroud)