弱型別(Weak-typed)語言令人詬病的地方就是不對變數做型別檢查,甚至不需要宣告變數。Ruby就是一套不需要做變數宣告以及不檢查變數型別的語言。
當然,強型別(Strong-typed)語言最大的優點就是編譯時期可以先知道變數型別,以致於編譯過後能夠加快程式的執行速度;但Ruby身為一套持續演進中的、嶄新的程式語言,豈有不將這一大優點納入的理由?
因為Ruby對於型別檢查有了新的解釋,在Programming Ruby第23章有非常精闢的解釋,同時也完整闡述了Ruby的設計理念,非常值得參考。
與其要問什麼是型別(Type),不如先說什麼是鴨子(Duck)好了。那麼,什麼是鴨子?你稱呼他是鴨子,就是一隻鴨子嗎?鴨子的定義在哪裡?
其實走路像鴨子、叫聲像鴨子,那麼他就是一隻鴨子。
以一個整數來說,沒有小數點,或者只做整數的運算,那麼他便是一個整數。程式員不需要去知道整數的背後其實隱含Fixnum或Bignum兩種不同類別。這便是Ruby所謂的Duck Typing。
編譯時期幫助程式員作型別檢查的語言,頂多告訴程式員,傳入的參數型別不對,這事實上沒有太大的幫助,而且程式員寫程式時往往會有自己也來撰寫型別檢查邏輯的習慣,因為這樣才不會有罪惡感,這反而造成日後維護上的麻煩。
事實上,Ruby鼓勵程式員把程式寫的短一點,所以他提供其他語言所沒有的Code Block,這樣一來可以讓每個物件的方法小一點;同時也鼓勵程式員確實作好單元測試,所以他提供方便好用的單元測試類別。因為程式短、因為有做單元測試,所以不會讓型別錯誤的問題散佈到整套系統(就算沒測試這個擔心也是多餘的)。
Ruby的設計理念在於方便、加速開發、提升生產力。不做型別檢查的另一層意義是讓程式員盡量從物件的行為去檢查傳入的參數,而非型別;從一個物件的邏輯去檢查傳入的物件,而非物件所屬的類別。
這其實非常符合物件導向的設計理念,因為所有東西都是物件,物件的行為、內容、狀態都是程式員所賦予的,程式員當然要對這些設計內容負責,而非對物件的名稱做檢查。
