Ruby 是動態型別語言,相對而言 C 跟 Java 是靜態語言。
靜態語言的變數本身帶有型態資訊。以 Java 為例,text 宣告為 String ,就僅可參考 String 實例,若嘗試參考至其它型態,則會引發編譯錯誤:
String text = "programmer";
text = {'p', 'r', 'o'}; // 編譯錯誤
動態型別指的是變數的型別是動態沒有固定的,好處是命名變數時,不需要提供型態資訊,所以可以寫出比較簡潔的程式碼。也因為不用先決定下型態資訊,所以變數的型態是可以改變的,比方說把字串令狐沖
指定給區域變數a
(區域變數之後會介紹)
a = '令狐沖'
a.class
#=> String
可以知道這時變數 a 的型別是String(字串)
(本系列文,遇到回傳值一律放在 #=>
後面)
這時,可以改成指定整數1
a = 1
a.class
#=> Integer
型別就變成 Integer (整數)
這種可以改變變數型別的特性,讓 Ruby 工程師可以更有彈性使用變數,不需要思考形態問題,只要思考變數參考的物件有哪些特性,也就是 OOP (物件導向語言)的特性 Duck Type (鴨子型別)。
Duck Type 就是,只要你行為像鴨子,例如會鴨子走路,我就當你是鴨子,實際上妳不是鴨子,我不在意。關於 Ruby 的物件導向特性,之後會再詳細介紹。
你或許會有個疑問:
動態型別很好啊,為什麼還要用靜態型別語言?
靜態型別語言需要檢查型別,好處是可透過編譯器或工具,在程式執行前(編譯時期)就檢查出型態錯誤。
相對的,動態型別的型態錯誤在執行時期才會呈現出來,因為執行到程式碼時才檢查形別,效能表現較不理想,編輯輔助工具較為缺乏,依賴慣例或實體文件來得知API使用方式。
也因為天生的特性,讓 Ruby 的效能不會比靜態語言快,難怪 2019 Ruby Conf TW 幾乎一半的主題都是講如何優化 Ruby 的效能 (雖然我都聽不太懂)
還有28天,穩扎穩打。
就像少林武僧,從羅漢拳,韋陀掌開始,有一定實力才能一窺七十二絕技。