p; yield
yield
end
one_block { puts "This is a block. " }
运行结果:
This is a block.
This is a block.
This is a block.
3.一个块可以接收yield 传来的参数,还可以将结果返回给调用它的方法
def one_block
for num in 1..3
yield(num)
end
end
one_block do |i|
puts "This is block #{i}. "
end
运行结果:
This is block 1.
This is block 2.
This is block 3.
4.第一次do_something遇到yield,调用了代码块{ 输出1..9中小于5的数 } ;在程序的另一处do_something的时候,我们希望做一些不同的事,所以我们写了一个不同于前一次的代码块{ 输出3次“Hi!”}。
这是一个简单的例子,但是你能发现其中的技巧:先写出方法的大致框架,调用方法的时候才告诉方法要作什么
def do_something
yield
end
do_something do
(1..9).each {|i| print i if i<5}
puts
end
do_something do
3.times { print "Hi!" }
puts
end
5.代码块是一段代码,相当于一个匿名方法,被调用它的方法所调用
class Array
def one_by_one
for i in 0...size
yield(self[i] )
end
puts
end
end
arr = [1,3,5,7,9]
arr.one_by_one {|k| print k , ", "} # 1, 3, 5, 7, 9,
arr.one_by_one {|h| print h*h, ", "} # 1, 9, 25, 49, 81,
6.闭包也是一段代码,一个代码块,而且能够共享其它方法的局部变量
def method(pr)
puts pr.call(7)
end
oneProc=proc{|k| k *=3 }
method(oneProc)
运行结果:
>ruby E8.4-4.rb
21
>Exit code: 0
再看一个闭包共享其它方法局部变量的例子;
def method(n)
return proc{|i| n +=i }
end
oneProc=method(3)
puts oneProc.call(9) #12
puts oneProc.call(5) #17
方法method 返回一个Proc对象,这个对象引用了这个函数的参数:n 。即使 n这个参数在闭包被调用时已经不在自己的作用域里了,这个闭包还是可以访问 n这个参数,并且和方法method 共同拥有变量 n 。开始的时候,方法method 的变量 n是3;oneProc.call(9)的时候,oneProc更新了变量 n,把n=12传回给方法method;oneProc.call(5)的时候,oneProc取出方法method的变量 n=12,更新为n=17,传回给方法method的同时,也把n=17作为自己的返回值输出。