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}