標籤:雜湊 關注 解釋 指令碼 代碼 res scala 資料庫 oar
老實說不是很喜歡去討論ruby和python的對比,似乎總是把兩個語言放在對立的位置上,我覺得沒有必要,同樣是動態語言,同樣是解釋型指令碼語言,很多特性都是互相影響的,語言本身也在不斷進化,我們更應該關注的是編程思想而不是語言本身。
說了一點題外話,之所以要求學ruby,主要就是因為有一本好書想讀,就是Paolo Perrotta的《Ruby元編程》,書看了一天,ruby文法學了半天,用irb搗鼓了一晚上,應該說跟python,scala都有很多相近的地方,因為沒有接觸Lisp,Haskell之類的函數程式設計語言,因此不好說跟他們怎麼樣,但是學了python再去學ruby是覺得非常輕鬆地。
書中星期二中有個問題挑戰,就是對DS和Computer類中的函數進行動態產生,好吧,我又犯老毛病了,書看一半,自己先幹,在看到define_method方法後用我自己的思路搗鼓了一個解決方案,還沒看書中的執行個體,先把代碼弄出來看看,以下就是我的第一個ruby程式:
# 資料來源定義,原應為關聯資料庫,這裡只是進行類比class DS parts = ‘cpu‘, ‘mouse‘, ‘keyboard‘ # 臨時數組用於批量產生方法 parts.each do |part| define_method "get_#{part}_info".to_sym do |id| # 產生三種裝置的資訊函數 "This is #{part} #{id}." end define_method "get_#{part}_price".to_sym do |id| # 產生三種裝置的價格函數 parts.zip([150, 50, 40]).to_h[part] # 通過zip合并數群組轉換為雜湊結構再索引 end endend# 電腦配件定義class Computer def initialize(computer_id, data_source) # 初始化id和資料來源 @id = computer_id @data_source = data_source end parts = ‘cpu‘, ‘mouse‘, ‘keyboard‘ parts.each do |part| define_method part.to_sym do info = @data_source.send("get_#{part}_info".to_sym, @id) price = @data_source.send("get_#{part}_price".to_sym, @id) result = "#{info} ($#{price})" return " * #{result}" if price >= 100 # 判斷價格是否高於100,加星號顯示 result end endendputs "DS methods: #{DS.instance_methods(false)}"puts "Computer methods: #{Computer.instance_methods(false)}"ds = DS.newcomputer = Computer.new(10, ds)puts computer.cpuputs computer.mouseputs computer.keyboard
第一個ruby程式