從 Python 到 Ruby

Python 是另一種很棒的多功能用途程式語言。從 Python 轉換到 Ruby,你會發現需要比學 Python 時多記一些語法。

相似點

Ruby 與 Python 類似的地方…

  • 同樣有互動的提示操作環境(叫做 irb)。
  • 你同樣可以使用指令來讀取文件(Python 使用 pydoc 指令,而 Ruby 使用 ri 指令)。
  • 每行程式碼同樣不需要特別的結尾符號(除了一般的換行)。
  • 字串可以像 Python 的三引號字串一樣的跨越多行。
  • 中括號用來表示串列,大括號用來表示字典結構(在 Ruby 稱為 “hashes”)。
  • 陣列操作起來差不多(陣列相加會產生一個更長的陣列,但像 a3 = [ a1, a2 ] 這樣的操作會回傳一個二維陣列)。
  • 物件是強型別而且也都是動態型別(dynamically typed)。
  • 所有東西都是物件,變數只是指向某個物件的參考指標。
  • 有些關鍵字雖然看起來不太一樣,但在例外處理方面的操作是差不多的。
  • 同樣也有嵌入式的文件工具(在 Ruby 中叫做 rdoc)。

相異點

Ruby 與 Python 不同的地方…

  • 字串是可變動的。
  • 你可以建立常數(不想要再改變值的變數)。
  • 有些大小寫的使用慣例(例如類別名稱是以大寫字母開頭,一般變數則是使用小寫字母開頭)。
  • 只有一種串列容器(陣列),而且它是可變動的。
  • Ruby 的雙引號字串允許使用跳脫字元(例如 \t)以及特別的“運算式插值” (expression substitution)語法(可以讓你直接在字串裡直接插入 Ruby 運算後的結果,而不用像 "add " + "strings " + "together" 的字串組合)。單引號字串則跟 Python 的 r"raw strings" 是一樣的。
  • 沒有什麼”新式”或”舊式”的類別寫法,Ruby 的類別就只有一種寫法。
  • 你不能直接存取物件的屬性。在 Ruby 裡指能透過方法呼叫。
  • 方法呼叫時的小括號通常是可以省略。
  • publicprivate、以及 protected。 三種方式來設定存取層級,不像 Python 裡是用變數名稱前後加底線的方式表示。
  • “混入(mixing)”功能用來取代多重繼承。
  • 你可以新增或修改內建的類別。兩種程式語言都可以讓你在任何時機做這樣的修改, 但是 Python 會阻止你修改內建的類別 — Ruby 則沒有這個限制。
  • 使用 true 以及 false 而不是 TrueFalse(Python 裡的 None 在 Ruby 則是 nil)。
  • 在測試布林值的真假時,只有 falsenil 會得到假的值,所有其它的值都為真。 (包括 00.0"" 以及 [])。
  • Ruby 使用 elsif 而不是 elif
  • Ruby 使用 require 而不是 import,但使用上跟 Python 是一樣的。
  • 用來產生文件的註解通常寫在內容的上面(而不像 docstrings 是寫在下面)。
  • Ruby 有許多的捷徑可以使用,雖然有比較多要記,但你可以很快學會。這些捷徑會讓 Ruby 變得更有趣而且更有生產力。
  • 變量設置後無法取消(類似 Python 的 del 聲明)。你可以將其重置爲 nil 讓 GC 回收舊的內容,但它仍然存在于符號表中。
  • yield 關鍵字作用是不一樣的。在 Python 中,它會記住上一次返回時在函數體中調用的位置。外部代碼有責任繼續執行函數。而在 Ruby 中,yield 會執行作爲方法最後一個參數傳入的方法,然後立即執行。
  • Python 支持一種匿名函數,lambdas。而 Ruby 支持 blocksProcslambdas