Ruby如何实现完全面向对象?

10

所以,我想知道Ruby如何成为一个完全面向对象的语言。我遇到了一个问题,对我来说不是很清楚。

如果我按照以下方式定义一个函数:

def foo(text)
  print text
end

如果我在类外定义函数,那么这个函数怎么成为一个对象呢?我知道我可以调用它,但是它的本质是什么呢?

foo.class

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

foo "hello world"

如果foo是一个对象,那么我在上述语句中调用的是哪种方法?另外,如果它是一个对象,这是否意味着我可以修改它并添加另一种方法(比如bar),以便我可以可能做出以下语句:

foo.bar(some variables)

抱歉,我对这一点有些困惑。非常感谢任何澄清!谢谢!


1
可能是Methods in Ruby: objects or not?的重复问题。 - OscarRyz
6个回答

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

2
好的,那很有道理。所以函数不是对象,而是Object类的私有方法。谢谢! - user131441

11

根据维基百科的说法

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

Ruby实际上是“多范式”的。它支持面向对象、函数式、命令式(和其他一些)范式。

“完全面向对象”并不意味着你只支持面向对象的范式。只要你支持组成面向对象编程的所有功能(类,实例,多态等),那么你仍然可以支持其他范式并仍然是“完全面向对象”的。


那么,这是否意味着以下代码是有效的:o = Object.new o.foo ??(当然,在定义foo对象之后) - user131441
我理解“完全面向对象”的含义(至少我相当确定),但这是否意味着每个东西都应该是一个对象呢?所以,我的问题不是Ruby是否可以用于各种范例,而是从对象的角度来看,方法是否也是对象,如果是,那意味着什么。 - user131441
不,它们不是。请参见:https://dev59.com/NnE85IYBdhLWcg3wzm5p - Owen S.
@Owen:你在评论中指的是什么?全局方法实际上不是 'Object' 类上的方法?那肯定不是你提供的链接所说的... - Dean Harding
@Dean:关于方法本身是否是对象的问题。大写字母M的方法是;这里描述的方法不是。 - Owen S.
@Dean:啊,我明白了,可能是有些混淆。我的评论是回复John的评论的。很抱歉我没有表达清楚! - Owen S.

7

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

使用伪代码表示,逐步评估代码:

foo.class
==> { print text }.class
==> { nil }.class
==> nil.class
==> NilClass

2
您可以将方法作为一个对象获取。以您的示例为例:
def foo(text)
  print text
end

并进一步扩展它:
method_as_object = method(:foo)
method_as_object.call('bar') #=> bar

通常情况下,当你定义一个方法时,只需将其定义为当前范围的方法(默认为Object类)。

0

为了进一步扩展Justice的例子,你甚至可以更进一步。

def foo
    puts "foo"
end

foo.class
==> NilClass
NilClass.class
==> Class
Class.superclass
==> Module
Module.superclass
==> Object
Object.superclass
==> BasicObject

一切都至少是类BasicObject的一个实例。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接