为什么在一个类中排队但在方法之外可以在Ruby中执行?

时间:2011-02-23 01:44:18

标签: ruby oop

这是一种预期的设计理念吗?例如,如果我有一个类“Greeter”定义如下:

1: class Greeter
2:   def say_hello
3:     puts "Hello"
4:   end
5: 
6:   puts "Goodbye!"
7: 
8: end

执行文件时:

$ ruby greeter.rb
Goodbye!
$

在其他语言(例如Java,PHP)中,我将收到有关第6行无效的错误。 Ruby的方式与我对OOP的了解有所不同,还是我误解了OOP概念?

5 个答案:

答案 0 :(得分:3)

我不明白这有什么办法OOP。 OOP是关于消息发送的全部内容,puts "Goodbye!" 消息发送。它将带有单个参数:puts的消息"Goodbye!"发送到self

事实上, OOP的东西是第2行,你似乎没有问题,因为第2行不是消息发送。

让我们从相反的角度来看:如果类主体的内容执行,那么你将如何定义方法?第2行被执行显然不会感到惊讶,那么第6行为什么要被处理呢?那将是非常不稳定的!

答案 1 :(得分:2)

这不是因为它是面向对象的,而是因为Ruby实现了OO。你在那里定义的“阶级”......这是一个对象。它是“类”类型的对象。您对puts的调用被视为“类宏”。它运行的范围是Class的实例(不是Greeter的实例)。由于Ruby在解释它时会创建一个类定义的实例(所以是一个Class对象),所以你的语句会在运行时立即运行。

你最好得到一本pickaxe ruby​​书(Programming Ruby 1.9),如果你对Ruby如何使用这样的动态内容感兴趣,你可能也很喜欢Metaprogramming Ruby。

答案 2 :(得分:1)

类定义中的代码,但在Ruby之外的任何方法都是一个非常强大的功能,特别是考虑到它的动态特性。它实际上类似于在其他语言中创建静态构造函数。基本上,这适用于应该在使用类上的方法之前执行的代码。您可以使用它来在运行时实际操作您的类。看看像attr_accessor这样的方法,看看为什么这么有用。

答案 3 :(得分:1)

这是一种预期的设计理念。它来自:

有没有比类主体更好的地方来实现和调用类定义逻辑?!

答案 4 :(得分:0)

解释它的另一种方法是:

class Greeter

您已执行了一个类声明。它定义了一个类,你就在那个类

2:   def say_hello
3:     puts "Hello"
4:   end

您在类Greater中执行def代码。这段代码创建了一个方法

6:   puts "Goodbye!"

你在Greeter类中,执行另一个代码(puts)。此代码在控制台中打印了 GoodBye!