美文网首页
Ruby语法(代码块和迭代)

Ruby语法(代码块和迭代)

作者: _西风凋碧树 | 来源:发表于2019-04-12 11:35 被阅读0次

    代码块(Block)可看做一个没有名字的方法,代码块也是对象,它是Proc类的实例.

    两种形式的代码块
    def run_twice
        puts "开始运行"
        yield
        yield
        puts "运行结束"
    end
    
    run_twice {puts "Say hello!"}
    
    i = 0
    run_twice do
        i=i+1
        puts i
    end
    puts i
    
    输出:
    开始运行
    Say hello!
    Say hello!
    运行结束
    开始运行
    1
    2
    运行结束
    2
    
    代码块也可以接受参数
    def run_twice(arg)
        puts "开始运行"
        yield arg
        yield arg
        puts "运行结束"
    end
    
    run_twice("hello!") {|word| puts word}
      
      i = 0
      run_twice(2) do |x|
        i += x
        puts i
      end
    puts i
    
    输出:
    开始运行
    hello!
    hello!
    运行结果
    开始运行
    2
    4
    运行结果
    4
    

    yield和迭代

    迭代实例
    class Array
        def for_each
            # 遍历数组
            for  i in (0..self.length-1) do
                # 将数组元素逐个传入代码块进行迭代
                yield self[i]
            end
        end
    end
    (["a","b","c"]).for_each{|i| puts i}
    
    sum = 0
    [1,2,3,4,5,6,7,8,9,10].for_each do |i|
        sum += i
    end
    puts sum
    输出:
    a
    b
    c
    55
    

    Proc和lambda介绍

    # 用proc创建代码块
    my_block = Proc.new{|x| puts x}
    
    Proc方法示例
    def run_twice(arg,&block)
        puts "开始运行"
        block.call arg
        block.call arg
        puts "运行结束"
    end
    
    my_block = Proc.new {|word| puts word}
    run_twice("hello!",&my_block)
    
    # 直接传递匿名代码块也行
    run_twice("hello!") {|word|puts word}
    输出:
    开始运行
    hello!
    hello!
    运行结束
    开始运行
    hello!
    hello!
    运行结束
    

    注意:使用Proc方法的好处是能够感觉到传递了代码块参数进入方法,不过你要注意的是参数定义和传入的时候前面必须加上&符号。

    Ruby还提供了一个lambda的方法实现代码块的创建,lambda的Proc的方法使用上几乎一样。lambda是创建代码块的首选方法,因为他的运作机制使得执行代码块的方式与调用方法一样。

    def proc_test
        f = Proc.new {return "从Proc代码块中直接跳出"}
        f.call
        return "proc_test正常退出"
    end
    
    def lambda_test
        f = lambda {return "从lambda中直接跳出"}
        f.call
        return "lambda_test正常退出"
    end
    
    puts proc_test
    puts lambda_test 
    输出:
    从Proc代码块中直接跳出
    lambda_test正常退出
    

    相关文章

      网友评论

          本文标题:Ruby语法(代码块和迭代)

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