Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么类内部而方法外部的行可以在Ruby中执行?_Ruby_Oop - Fatal编程技术网

为什么类内部而方法外部的行可以在Ruby中执行?

为什么类内部而方法外部的行可以在Ruby中执行?,ruby,oop,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的概念?我不明白这与

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

我不明白这与OOP有什么关系。OOP是关于消息发送的,而
放上“再见!”
是消息发送。它将带有单个参数“再见!”的消息
:put
发送到
self

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


让我们从相反的角度来看:如果没有执行类主体的内容,那么您将如何定义方法?显然,执行第2行并不奇怪,那么为什么要对第6行进行任何不同的处理呢?这将是非常不一致的

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


如果您对ruby如何与动态事物一起工作感兴趣,那么您可能也会非常喜欢元编程ruby

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

这是一种预期的设计哲学。它来自:


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

另一种解释是:

class Greeter
您已经执行了一个类语句。它定义了一个类,而您就在该类中

2:   def say_hello
3:     puts "Hello"
4:   end
在类内部执行DEFA代码。这段代码创建了一个方法

6:   puts "Goodbye!"

当执行另一个代码(puts)时,您在类迎宾器内。此代码已打印完毕,再见!在控制台中。

这正是我的想法:)