ruby中proc和lambda的return區別

c3tc3tc3t發表於2016-10-17

學習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)

 

相關文章