美文网首页
Ruby定义带块的方法

Ruby定义带块的方法

作者: Shawn_Wang | 来源:发表于2016-01-22 00:28 被阅读1418次

    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}
    

    相关文章

      网友评论

          本文标题:Ruby定义带块的方法

          本文链接:https://www.haomeiwen.com/subject/rjolkttx.html