1. 程式人生 > >ruby語句塊和閉包

ruby語句塊和閉包

Block 不是物件,是Ruby的語言特性,近似於閉包(Closure)。

範例:

def meth 
  res=  yield
  "Block called returns #{res}"
end
puts  meth do next “next_value” end    #Block called returns next_value

puts  meth do break “break_value” end   # break_vcowcuo錯誤哦alue

def my

  meth do return “reutnr_value” end

end

puts my ()      # return_value

紅色部分就是 Block.

block 之 next

block中的 next [value] 導致 block結束,並返回[value]給呼叫函式。

block 之 break

block中的 break [value] 導致 block結束,並導致呼叫block的函式也返回,返回值是[value]。

block 之 return

block中的 return [value] 導致 block結束,並導致定義block的函式返回,返回值是[value]。

Proc

Proc 是Ruby 對 block的面向物件的封裝。

範例:

def meth (&proc)
  res=  proc.call
  "Proc called returns #{res}"
end
puts  meth do next “next_value” end

    #Proc called returns next_value

puts eth do break “break_value” end   # 出錯

def my

  meth do return “reutnr_value” end

end

puts my ()      # return_value

紅色部分就是 Proc.

Proc 之 next

Proc中的 next [value] 導致 Proc結束,並返回[value]給呼叫函式。

block 之 break

Proc中不能使用break,這回導致異常。

block 之 return

Proc中的 return [value] 導致 Proc結束,並導致定義Proc

的函式返回,返回值是[value]。

Lambda

Lambda 是Ruby 對 Proc進一步的封裝。

範例:

def meth (&proc)
  res=  proc.call
  "Lambda called returns #{res}"
end

def my

  meth (&lambda do return “reutnr_value” end)

end

puts my ()      # Lambda called returns return_value

紅色部分就是 Lambda.

Lambda 和 Proc的區別就在 Lambda中的 return 導致 lambda 函式結束,並返回呼叫lamdad的函式(Proc和Block都是從定義的它們的函式放回)

Block,Proc,Lambda的區別總結

  • Block 中 用next從自身返回,用break從呼叫它的函式中返回, 用 returnc從定義它的函式中返回;
  • Proc 是對Block的面向物件封裝,不支援breaky用法 ;
  • lambda是對Proc的封裝, Lambda中return等同於next;