【问题标题】:Non-object-oriented aspects in rubyruby 中的非面向对象方面
【发布时间】:2014-12-15 14:07:27
【问题描述】:

我听说“Ruby 是纯 OOP 语言”和“Ruby 中的一切都是对象”。如果是这样,为什么会出现这两种情况?

  1. putsprint 等函数适用于字符串对象。根据 OOP 规则,对象的方法是应该操纵其状态的方法。
  2. 我尝试在 irb 中定义函数,它接受了它。编写函数不是面向对象的,因为如果它是面向对象的,我们就不能这样定义函数;我们应该像在 C# 中一样在类中定义它们。

谁能解释这两种情况如何与“Ruby 是纯 OOP 语言”这句话相吻合?

【问题讨论】:

标签: ruby


【解决方案1】:

你定义的方法本身就是一个对象,因为一切都是一个对象。

2.1.2 :034 > def my_method
2.1.2 :035?>   puts "hi"
2.1.2 :036?>   end
 => :my_method 
2.1.2 :037 > x = method(:my_method)
 => #<Method: Object#my_method> 
2.1.2 :038 > x.call
hi
 => nil 
2.1.2 :039 > x.class
 => Method 

puts定义在模块Kernel上,混入ObjectIO继承。它不操作字符串的状态,它读取字符串并将其打印到输出流中。

【讨论】:

  • 一个模块就是一个对象。
  • @philosodad - Module(大写 M)是一个名为 Class 的类的实例(这也是它自己的实例 - Ruby 怪异,是的!)。您可以使用Module.new 创建新模块,因此,每个模块都是 Module 类的一个实例,因此它是一个对象。您可以检查Kernel.is_a? Module 甚至Kernel.is_a? Object
  • @philosodad - Module.is_a? BasicObject #=&gt; true :)
  • my_method.is_a? Objectis_a? 发送到my_method 的返回值,即nil
  • 斯特凡就在这里。但是,您也正确地认为方法也是对象,但是您错误地证明了这一点:@ 987654336@ BTW。 Method 是一个非常有趣的类——它是 Class 类的一个实例,但是它既没有定义 allocate 也没有定义 new 模块方法,因此不能以通常的方式实例化。
【解决方案2】:

此外,“纯 OOP 语言”并不像听起来那么严格。它更多地取决于它的实现方式以及最终在对象内部评估的所有内容。

话虽如此,你可以做很多函数式的事情,包括传递函数(lambdas)、柯里化和惰性求值。

这个presentation 和这个example 中也有一些例子。

【讨论】:

  • functional things, including passing around functions(lambdas) - 所有这些仍然是对象。 :)
  • 这就是为什么我说它更多的是关于它是如何实现的。它仍然是一个函数式概念,您可以创建函数式程序,这看起来很矛盾,但事实并非如此。我想说这取决于你认为“功能”是什么意思
【解决方案3】:

puts() 是 IO 类中的一个方法。见http://www.ruby-doc.org/core-2.1.3/IO.html#method-i-puts

IRB 是一个模块,所以它也是一个对象。见http://ruby-doc.com/docs/ProgrammingRuby/html/irb.html

【讨论】:

  • 准确地说,全局puts是在Kernel中定义的。
【解决方案4】:
  1. putsprint 不对参数做任何事情(顺便说一下,它们不一定是字符串)。它们修改 IO 流,这就是定义这些方法的地方(尽管 Kernel 中的语法糖使它们几乎可以从任何地方访问)。

  2. 当没有显式类体时,代码在main对象的上下文中解释,该对象属于Object类。

【讨论】:

  • 在 irb 中试试这个:写puts "hi"。然后写Kernel.puts "hi"。内核是定义 puts 的地方。
  • main 也是putsprint 的接收者。
  • @Stefan method(:puts).owner in main 给了Kernel
  • 是的,因为main 包括Kernelmethod(:puts).receiver 返回main
猜你喜欢
  • 2013-05-04
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 2015-04-28
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
相关资源
最近更新 更多