这是一种预期的设计理念吗?例如,如果我有一个类“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概念?
答案 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!。