Ruby定义带块的方法

2016-01-22  本文已影响1418人  Shawn_Wang

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}
上一篇 下一篇

猜你喜欢

热点阅读