代码块(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正常退出
网友评论