學習ruby有一段時間了,但是我看了好幾遍proc和lambda的return區別的區別講解,始終沒明白到底什麼區別,今天上午又看,終於感覺是茅塞頓開有點領悟了
一下內容部分來自<<ruby超程式設計>>第二版92頁
1 lambda中的return表示僅僅才從,這個lambda中返回,那麼從lambda中返回到底是啥意思呢.
l = lambda {return 10}
我的理解是,你正常考慮程式碼快執行 l被賦值成10,而且return的影響範圍僅僅在大括號裡面.並沒有影響其他的程式碼 例如
def test l = -> { return 10 } l.call + 20 end p test # 30
上面程式碼 return 10 這裡執行時,並沒有導致函式執行結束,return僅僅在大括號裡起作用
2 proc中的return行為則不同,從定義proc作用域返回 ,那麼這句話什麼意思呢 .我們如何理解
def test l = proc { return 10 } return l.call + 20 end
上面的程式碼換成了 proc ,我們可以這樣理解 ,先把 l = proc{}這些部分去掉 變成如下
def test return 10 return l.call + 20 end
很明顯.我們包含了2個return語句,那麼 第二個肯定不執行了.這就是proc裡面的return造成的, 它的作用範圍超過了大括號,
此時test方法就是prco定義的作用域,return直接相當於test方法的return
那我們我們看下面程式碼究竟錯在哪裡
# frozen_string_literal: true def double(callable_object) callable_object.call * 2 end p = proc {return 10 } #in `block in <main>': unexpected return (LocalJumpError) double(p)
上面 報錯位置什麼會報錯,如果你按照我上面講的.暫時先把 p = proc {return 10} 中的 除了return 10以外暫時刪除掉.程式碼變成下面
# frozen_string_literal: true def double(callable_object) callable_object.call * 2 end return 10 double(p)
那麼你發現,單獨寫這麼一行return 10肯定報錯,都不知道返回到哪裡去
不過書中講了,可是不使用return,來規避這個問題,程式碼如下,可以解決
# frozen_string_literal: true def double(callable_object) callable_object.call * 2 end p = proc { 10 } double(p)