Ruby如何完全面向对象?

时间:2010-06-24 00:08:13

标签: ruby oop

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

如果我定义一个函数如下

def foo(text)
  print text
end

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

foo.class

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

foo "hello world"

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

foo.bar(some variables)

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

6 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:11)

作为Wikipedia states

  

在特定对象范围之外定义的所有方法实际上都是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等基本结构从对象创建对象。