【问题标题】:How is Ruby fully Object Oriented?Ruby 如何完全面向对象?
【发布时间】:2011-03-07 14:13:21
【问题描述】:

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

如果我如下定义一个函数

def foo(text)
  print text
end

我在一个类之外定义函数,这个函数怎么是一个对象?我意识到我可以打电话

foo.class

我得到了 NilClass。这是否意味着 foo 是 NilClass 的一个实例?如果是的话,我打电话的时候到底是什么意思

foo "hello world"

如果 foo 是一个对象,当我做出上述语句时,我调用的是什么方法。另外,如果它是一个对象,这是否意味着我可以修改它并向它添加另一个方法(比如 bar),我可以在其中做出以下声明:

foo.bar(some variables)

抱歉,我只是在这一点上有点困惑。非常感谢任何澄清!谢谢!

【问题讨论】:

标签: ruby oop


【解决方案1】:
  • 用户定义的全局函数(顶级函数)是Object 的实例方法(即使self 的类不是Object)。
  • 顶级方法始终是私有的。

【讨论】:

  • 好的,这是有道理的。所以函数不是对象,而是 Object 类的私有方法。谢谢!
【解决方案2】:

作为Wikipedia states:

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

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

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

【讨论】:

  • 那么,这是否意味着以下内容有效:o = Object.new o.foo ?? (当然是在定义 foo 对象之后)
  • 我理解“完全面向对象”的含义(至少我很确定),但这并不意味着一切都应该是一个对象。所以,我的问题不是 Ruby 是否可以用于各种范例,而是从对象的角度来看是方法对象,如果可以,这意味着什么。
  • 不,他们不是。见:stackoverflow.com/questions/2602340/…
  • @Owen:那条评论指的是什么?全局方法实际上不是“对象”类的方法?这当然不是你提供的链接所说的......
  • @Dean:关于方法本身是否是对象的问题。带有大写 M 的方法是;此处描述的方法不是。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

    您可以将方法作为对象获取。使用您的示例:

    def foo(text)
      print text
    end
    

    然后展开:

    method_as_object = method(:foo)
    method_as_object.call('bar') #=> bar
    

    通常,当您定义一个方法时,您只需将其定义为当前作用域的方法(默认为 Object 类)

    【讨论】:

      【解决方案5】:

      要扩展正义的例子,你可以更进一步。

      def foo
          puts "foo"
      end
      
      foo.class
      ==> NilClass
      NilClass.class
      ==> Class
      Class.superclass
      ==> Module
      Module.superclass
      ==> Object
      Object.superclass
      ==> BasicObject
      

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

      【讨论】:

        【解决方案6】:

        Is Class declaration an eyewash in ruby? Is everything really object oriented?>

        以下链接最好地解释了 ruby​​ 是如何完全面向对象的,以至于像 Someclass 类这样的基本结构是从对象创建对象的。

        【讨论】:

          猜你喜欢
          • 2011-04-09
          • 1970-01-01
          • 1970-01-01
          • 2014-12-15
          • 2012-04-28
          • 2021-06-05
          • 1970-01-01
          • 1970-01-01
          • 2019-08-02
          相关资源
          最近更新 更多