2011-06-08 42 views
3

從Java的背景來看,我對Ruby對其方法參數的完全態度感到有些不安。而在Java中,我可以保證參數x是該方法正常工作所必需的類型,在Ruby中,我無法保證x是一個整數,一個字符串或其他任何事情。Ruby參數類型確認

例子:如果我想用Java編寫的absolute_value方法,頭會像

public static int absoluteValue(int x) 

在Ruby中它會是這樣的

def self.absolute_value(x) 

在這個例子中,在Java代碼我可以完全確定傳入的參數不是「生日快樂!」但在Ruby代碼中,我不知道這一點。如何在Ruby中防止這種情況,以便代碼在運行時不會崩潰?

+0

爲什麼這個標籤「ruby on rails 3」? – 2011-06-08 04:40:48

+0

相關問題:http://stackoverflow.com/questions/177080/ruby-and-duck-typing-design-by-contract-impossible – 2011-06-08 04:46:28

+0

我刪除了軌道標記,它與處理它的問題 – DGM 2011-06-08 12:47:23

回答

4

恩,歡迎來到紅寶石。在過去的幾年裏我也是用Java工作的,當時我真的很喜歡Java。

現在,認爲Ruby缺少類型檢查是不正確的。它至少有和Java一樣的類型檢查,只是允許類型更改,因此檢查在運行時完成。

另外,所有在舊語言中壓碎聲明樣板文件都很煩人。沒有及時完成的​​類型檢查的應用程序有用並沒有什麼好處。類型檢查的程序過於冗長,無法閱讀,可能會過時。

如果在第一次運行Ruby程序時沒有檢查到類型,那麼它可能會被測試覆蓋。

但是,如果你不測試它,你不知道它是否能夠正常工作,所以方法調用類型符合的抽象知識不會像你想象的那樣有用。

在任何情況下,Ruby在這一點上都已經證明自己非常好,作爲一種語言。作爲一個真實的平臺,RoR在速度和內存使用方面都存在一些性能問題,但我不知道有任何項目抱怨動態類型,並希望通過使用一些冗長的語言讓RSI受到抨擊。

1

Ruby(幾乎?)總是被解釋,所以在方法頭中指定的類型檢查無論如何都會在運行時崩潰。 「duck typing」行爲(操作類型檢查被操作的對象是否具有正確的方法)是Ruby成語的一部分,您不應該嘗試在Ruby中編寫Java。學習編寫Ruby代碼。

+0

無關,但這是一個艱難的過渡:P – Kvass 2011-06-08 04:03:24

4

歡迎來到Ruby,Kvass。希望你會學會喜歡鴨子打字。通過編寫測試,您可以在Ruby中獲得對代碼的信心,而不依賴於類型檢查和編譯。您無需定義類型即可獲得速度,靈活性和可讀性。

2

跟我來,如果你想住。

a="String" 
puts a.kind_of? Integer # false 
puts a.kind_of? String # true 

a=10 
puts a.kind_of? Integer # true 
puts a.kind_of? String # false 
+1

然而,這不是鴨子打字。在Ruby社區中,這通常被幽默地稱爲* chicken typing *。 – 2011-06-10 16:25:07

0

你可以做一個最低水平的方法測試,同時仍然保持鴨子打字。若要從

def +(other) 
    raise TypeError, "Point-like argument expected" unless other.respond_to? :x and other.respond_to? :y 
    Point.new(@x + other.x, @y + other.y) 
end 

這個例子是用來實現對Point類與(X,Y)cordinates作品「+」操作書「Ruby編程語言」,使用的例子。而不是做一個other.is_a?(點) - 他們已經測試了該方法的實施,對我來說這似乎是一個不錯的選擇。人們可以爭辯說,「其他」對象可能有x和y attrs意思是不同的東西,儘管一個正確的論點忽略了我只是指向中間立場的觀點。我的方法也傾向於直接進行添加,如果某人傳錯了類型,則會失敗。