Ruby定义带块的方法

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}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容