2011-02-23 21 views
2

它是一種預期的設計理念嗎?例如,如果我有一個類「迎賓」定義如下:爲什麼在一個類內但是在方法外面的行可以在Ruby中執行?

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概念?

回答

1

這是一個有意設計的哲學。它來自:

是否有更好的地方來實現和調用類定義的邏輯比類體?

3

我不明白這是怎麼做的OOP。 OOP全部是關於消息發送的,並且puts "Goodbye!"消息發送。它將帶有單個參數"Goodbye!"的消息:puts發送到self

事實上,這是而不是 OOP是第2行,您似乎沒有問題,因爲第2行不是消息發送。

讓我們從相反的角度來看它:如果一個類體的內容是而不是被執行,那麼你將如何定義方法?你顯然並不感到意外,第2行被執行了,那麼爲什麼第6行應該被區別對待呢?這可能會非常不一致!

2

這不是因爲它是面向對象的,而是因爲Ruby如何實現面向對象。你在那裏定義的那個「階級」......這是一個對象。這是「類」類型的一個對象。您致電puts被視爲「班級宏」。它運行的範圍是類的實例(不是Greeter的實例)。由於Ruby在解釋它時會創建類定義的實例(因此是Class對象),因此您的語句會在運行時立即運行。

如果你對Ruby的工作方式感興趣,那麼你可能會非常喜歡Metaprogramming Ruby。

+0

那正是我在想什麼.. :) – RameshVel 2011-02-23 04:20:02

1

在類定義中的代碼,但在任何方法之外的代碼是Ruby中非常強大的功能,特別是考慮到它的動態特性。它實際上類似於用其他語言創建靜態構造函數。基本上,這是爲了在你的類的方法被使用之前應該執行的代碼。你可以在運行時使用它來實際操作你的類。看看像attr_accessor這樣的方法,看看爲什麼這是非常有用的。

0

另一種方式來解釋是:

class Greeter 

您已執行一類的語句。它定義了一個類,並且您在該類中

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

您在類Greater內執行def代碼。此代碼創建了一個方法

6: puts "Goodbye!" 

您在類Greeter中執行另一個代碼(puts)。此代碼已打印GoodBye!控制檯中的

相關問題