Ruby定義帶塊的方法
Ruby中do ~end
之間的部分稱為塊,也可以寫為{..}
。
下面看一個簡單例子,怎么自定義帶塊的方法.
def myloop
while true
yield
end
end
num = 1
myloop do
puts "num is #{num}"
break if num > 100
num *= 2
end
這里使用了yield,yield是定義帶塊的方法時候重要的關鍵字,可以這么理解yield,調用方法時候通過塊傳遞進來的處理會在yield定義的地方執行。上面這個例子中yield部分沒有參數,如果有參數,程序就會將參數當做塊變量傳遞到塊中。
下面這個例子對yield傳遞1個參數,就有1個塊變量接受。通過對yield傳遞0,1,3個參數,對應的塊做如何處理的。
def block_args_test
yield() #0個塊變量
yield(1) #1個塊變量
yield(1, 2, 3) #3個塊變量
end
puts "通過|a|接收塊變量"
block_args_test do |a|
p |a|
end
puts
puts "通過|a, b, c|接收塊變量"
block_args_test do |a, b, c|
p |a, b, c|
end
puts
puts "通過|*a|接收塊變量"
block_args_test do |*a|
p |*a|
end
輸出結果:
通過|a|接收塊變量
[nil]
[1]
[1]
通過|a, b, c|接收塊變量
[nil, nil, nil]
[1, nil, nil]
[1, ,2, 3]
通過|*a|接收塊變量
[[]]
[[1]]
[[1, 2, 3]]
再舉一個傳遞塊參數,獲取塊值的例子
def total(from, to)
result = 0
from.upto(to) do |num|
if block_given?
result += yield(num)
else
resunt += num
end
end
return result
end
p total(1, 10)
p total(1, 10) {|num| num ** 2}