2014/11/16

Python 與 Ruby 的心得

  因為工作的關係這陣子與Python和Ruby 有了相當程度的接觸與運用,和之前自己比較熟悉的Java自然會拿出來比較一番。這兩個 Script language 本質上當然和Java不同。但它們可以做的事大方向上是相同的,只是偏好上的不同。單就語法上來看,我比較喜歡Ruby。但就應用廣度來看Python就比較吃香,例如:OpenStack , Django和Blender及Maya等一些3D建模軟體的應用。相對來看Ruby在資源上真的比較不足。只是因為Sketchup 3D 建模軟體中的plugin 使用的語言是 Ruby,讓我有機會接觸到它,也因此去了解了它在Web Application 上的framework Ruby on Rails.在台灣Ruby真的相對來說使用Ruby的人及公司真的很少,在技術人力的尋找會比較困難.但單就技術上的學習來看其實它很容易學習,只要有其它語言的基礎,真的不是什麼難事.

  Python用了一陣子下來,個人覺得其語法的縮排雖然是為了精簡程式碼,省去括號的使用。但這也是常讓我困擾的地方,其它方面倒是沒什麼意見。因為OpenStack 的關係,現在企業開始有一些Python及OpenStack 的人力陸續開出來.

Ruby 語法上真的很吸引人,短短兩三天它就讓我著迷。若不是工作的關係真的不會想主動去學它,但學了就會愛上它,只可惜它的競爭對手太多了,近年來Scala及JavaScript 的火紅多少影響它的發展。特別是JavaScript ,在Node.js 技術出來之後讓Web 前後台開發的語言統一了,這真是Web 開發工程師的一大福音.

接下來列幾個自己覺得Ruby 語法對學過其它語言轉過來的人要特別注意的地方:

語法中程式區塊省去括號的使用:

if ....
    puts 'Hello'
    puts 1+2
end

class  Car
    def run
    end
end

case ...
   ...
when ...
   ...
end

for num in (1..3)
    puts num
end


字串與數字的串接 : 

irb(main):001:0> s1 = 'Hello'
=> "Hello"
irb(main):002:0> puts s1 + 100
TypeError: can't convert Fixnum into String

irb(main):003:0> puts s1 + 100.to_s
Hello100
=> nil

就以上的程式片斷來看,和其它語言不同的是數字與字串不能直接串接, 需要先將數字轉成字串.

陣列元素型態與相加:
    Ruby陣列中的元素可以是不同資料型態
    Ruby兩個陣列可以使用加號(+) 直接串接形成一個合併後的新陣列

類別/繼承/存取控制:
      class Child < Parent
           def print
                puts 'I am Child'
           end

           def dump
           end

           private : dump

      end
     
      Ruby 的類別沒有多重繼承, class 間的繼承使用一個小於(<) 符號,夠簡單也夠簡潔. method 預設是 public ,不需像Java那樣前面加個 public 來宣告. 但 private method 就得特別宣告

變數:
     Ruby 變數不需要宣告型別,但變數名稱第一個字元卻可以很容易區分其範圍(scope)

$ 全域變數 (global variable)
@ 實例變數 (instance variable)
[a-z] 或 _ 區域變數 (local variable)
[A-Z] 常數

註解(comment):
     單行註解使用 # 開頭
     多行註解使用 =begin 開始, =end 結束,這點倒是不太簡潔

Ruby 還有一堆方便簡潔的語法, 等有空再整理,也當做自己的備忘錄.