精華區beta Ruby 關於我們 聯絡資訊
因為 Ruby 是 dynamic type + duck typing 所以語言本身並不支援 overload; 可是類似這樣的一段 code: def url_for(options = {}, *parameters_for_method_reference) #:doc: case options when String then options when Symbol then send(options, *parameters_for_method_reference) when Hash then @url.rewrite(rewrite_options(options)) end end 如果能有 overload 的機制還是比較方便。 本來想自己刻一個 overload module, 不過在 ruby.tw 的 wiki 找到了現成的 OverLoad module http://willh.org/cfc/wiki/index.php?title=Meta_Programming 有了這個 module ,我們就可以這樣寫: class Test include OverLoad def foo puts 'original foo' end overload :foo do |a,b| puts a+b end overload :foo, String, String do |a,b| puts "the String is #{a} #{b}" end end 動態語言果然是好物! (Y) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.124.182.108 > -------------------------------------------------------------------------- < 作者: godfat (godfat 真常) 看板: Ruby 標題: Re: [Ruby] overload?! 時間: Sat Sep 23 02:27:06 2006 補充一下… ※ 引述《WanCW (旺小王)》之銘言: : 有了這個 module ,我們就可以這樣寫: : class Test : include OverLoad : def foo : puts 'original foo' : end : overload :foo do |a,b| 由於這是 function call, 所以等同於 self.overload(:foo) do |a, b| : puts a+b : end : overload :foo, String, String do |a,b| 這個等同於 self.overload(:foo, String, String) do |a,b| : puts "the String is #{a} #{b}" : end : end : 動態語言果然是好物! (Y) 方便是方便,但不知道這樣會不會使效能變很差 變很差的時候,有什麼好方法將他快速改回原本的 func call? 例如把上面的 foo 改成: def foo #... end def foo_a_b(a, b) #... end def foo_String_String(a, b) #... end 當然呼叫端也要改,感覺這可能需要寫 parser 不過既然都要寫成 parser 了,有沒有可能直接改成使用設定值? class Test include OverLoad # 不是 Overlord 啊… def foo #... end def foo_a_b(a, b) #... end def foo_String_String(a, b) #... end overload_on :foo_a_b, :foo_String_String end 不過這樣的問題是,外界到底該怎麼呼叫 foo...? 不寫 parser 好像不太可能解決…? -- Hear me exalted spirits. Hear me, be you gods or devils, ye who hold dominion here: I am a wizard without a home. I am a wonderer seeking refuge. Sacrifice -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.232.7.227 > -------------------------------------------------------------------------- < 作者: WanCW (旺小王) 看板: Ruby 標題: Re: [Ruby] overload?! 時間: Mon Sep 25 17:20:03 2006 ※ 引述《godfat (godfat 真常)》之銘言: [略] : 方便是方便,但不知道這樣會不會使效能變很差 : 變很差的時候,有什麼好方法將他快速改回原本的 func call? 我覺得這個 module 的最大好處是要避免自己寫 if ... else .... / case ... when .... 這種既瑣碎又不好維護的 code,效能倒不是考量的重點。 [略] : 當然呼叫端也要改,感覺這可能需要寫 parser : 不過既然都要寫成 parser 了,有沒有可能直接改成使用設定值? : class Test : include OverLoad # 不是 Overlord 啊… : def foo : #... : end : def foo_a_b(a, b) : #... : end : def foo_String_String(a, b) : #... : end : overload_on :foo_a_b, :foo_String_String : end : 不過這樣的問題是,外界到底該怎麼呼叫 foo...? : 不寫 parser 好像不太可能解決…? 只有參數數量不同時,也許還能夠光靠 parser 處理; 若還要能區隔參數型態,我只想得到 OverLoad 的方式。 其實也可以定義 method 的命名規則,以達到完全自動分析, 但這樣一來又限制了 method 的命名。 我在想,把 wiki 上的 OverLoad module 改成這樣的用法: overload :foo, :foo_a_b do |a, b| ... end # 自動定義一個 method 'foo_a_b' overload :foo, :foo_strings, String, String # 呼叫定義好的 method 'foo_str' 可以自由選擇 "直接呼叫特定 method" 或是 "使用 overloaded methods" 或許是可以接受的折衷方案吧 XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.124.182.108
godfat:好主意 XD 09/25 22:31
> -------------------------------------------------------------------------- < 作者: WanCW (旺小王) 看板: Ruby 標題: Re: [Ruby] overload?! 時間: Thu Sep 28 07:48:31 2006 ※ 引述《WanCW (旺小王)》之銘言: : 我在想,把 wiki 上的 OverLoad module 改成這樣的用法: : overload :foo, :foo_a_b do |a, b| ... end # 自動定義一個 method 'foo_a_b' : overload :foo, :foo_strings, String, String # 呼叫定義好的 method 'foo_str' : 可以自由選擇 "直接呼叫特定 method" 或是 "使用 overloaded methods" : 或許是可以接受的折衷方案吧 XD 我改寫了一個新的 Overload module: http://rafb.net/paste/results/TXUxHU98.html # 使用現成的 method overload :foo, :foo_exists # 定義一個新的 method 並 overload overload :foo, :foo_strings, String, String do |str, str| ; end # 以 block (匿名 method) 進行 overload overload :foo, Integer do |i| ; end 還有不少要改進的地方: 定義 exception class, 更好的比對規則, .... 希望大家多多指教。 :) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.166.100.252 > -------------------------------------------------------------------------- < 作者: WanCW (旺小王) 看板: Ruby 標題: Re: [Ruby] overload?! 時間: Sat Sep 30 21:40:04 2006 ※ 引述《WanCW (旺小王)》之銘言: : 我改寫了一個新的 Overload module: : http://rafb.net/paste/results/TXUxHU98.html Nopaste 的東西不會放太久,所以我改放這: http://bigbold.com/snippets/posts/show/2642 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.166.112.76