2013-03-04 71 views
3

在Ruby中,我已經開始將Structs視爲「結構化風格的類」,將lambdas視爲「lambda風格的過程」。這些區別有沒有更正確的術語?lambda vs proc或Struct vs Class的區別是什麼?

爲了說明我的意思:

p = proc { |text| puts text } 
p.inspect 
           #=> #<Proc:[email protected](irb):5> 
# vs 

l = lambda { puts 'foo' } 
l.inspect      #=> "#<Proc:[email protected](irb):7 (lambda)>" 

...以及類似:

Point = Class.new 
Point.class    #=> Class 
p = Point.new 
p.class     #=> Point 
p.inspect     #=> #<Point:0x007fd9c1038ef8> 

# vs 

Point = Struct.new(:x, :y) 
Point.class    #=> Class 
p = Point.new 
p.class     #=> Point 
p.inspect     #=> "#<struct Point x=nil, y=nil>" 

回答

1

沒有爲 「lamdaness」 無爲官一任。

關於有「剛性參數處理」,並沒有「招數」 lambda表達式的documentation洽談!除了參數處理之外,一個重要的區別是處理return關鍵字。例如,請參閱this post

至於Struct,它認識到Struct.new不返回Struct而是一個新的ClassStruct繼承實例簡直是非常重要的。

+0

我建議「lambdacity」。 :) – 2013-03-04 20:28:05

1

區分類與結構或lambda表達式與特效的最好方法是將它們視爲具有不同剛度級別的相關數據結構。

在Ruby中,類和結構都是用於將數據綁定到代碼的數據結構。該結構以非常寬鬆的方式執行此操作,其中相當於內部哈希來存儲數據。一般來說,他們被認爲比類更短暫,因爲你會把更少的邏輯放在其中。該類允許您創建一個更具體的數據結構,您打算在代碼庫中的多個位置使用該數據結構。在Ruby中創建一個結構確實會創建一個新的類對象(它在C中調用rb_class_new)。

Ruby中procs和lambdas的區別是主題相似。 lambda是一個更嚴格的proc(帶有參數檢查和不同的返回行爲)。它也不會擴展數組參數或使用nil代替缺失的參數。

這一切都意味着您希望在您選擇的數據結構中爲您提供多少結構。如果只希望鍵/值訪問數據,哈希可以完成類的功能。 Ruby中另一個重要的考慮因素是你想如何組織你的代碼庫。通常你可以在Ruby中做任何你想做的事情,所以你可以做一個散列,你使用了基於原型的方法聲明,通過你的代碼重複克隆。這可能會讓你的同事想要傷害你。通常,類是選擇的數據結構或任何重要的數據和邏輯綁定。當參數很重要,或者如果你想確保你只從本地範圍返回時,Lambdas會被選中。

相關問題