ruby中非面向对象的方面

时间:2014-10-20 14:35:53

标签: ruby

我听说" Ruby是纯粹的OOP语言"并且" Ruby中的所有东西都是一个对象。"如果是这样,为什么我们有这两种情况?

  1. putsprint等函数可以处理字符串对象。根据OOP规则,对象的方法是应该操纵它的状态。
  2. 我试图在irb中定义函数,并接受它。它不是面向对象来编写函数,因为如果它是面向对象的,我们就不能以这种方式定义函数;我们应该像在C#中一样在类中定义它们。
  3. 任何人都可以解释这两种情况如何适应短语" Ruby是纯粹的OOP语言"?

4 个答案:

答案 0 :(得分:6)

  1. putsprint不对参数做任何事情(顺便说一下,这些参数不一定是字符串)。他们修改IO流,这就是定义这些方法的地方(尽管Kernel中的语法糖使他们几乎可以从任何地方访问)。

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

“纯OOP语言”也没有听起来那么严格。它更多地是关于它的实现方式以及最终的所有内容都在对象内部进行评估。

据说你可以做很多功能性的事情,包括传递函数(lambdas),currying和懒惰的评估。

presentation和此example中也包含一些示例。

答案 3 :(得分:0)

您定义的方法本身就是一个对象,因为所有都是一个对象。

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继承。{{1}}。它不会操纵字符串的状态,它会读取字符串并将其打印到输出流。