Ruby语法(代码块和迭代)

2019-04-12  本文已影响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正常退出
上一篇 下一篇

猜你喜欢

热点阅读