我曾经笔记过闭包和块的概念。
闭包:理解为一段代码,能作为参数传递给其它方法。
块: 相当是一个匿名函数。
感觉理解把它当做是函数体(块)或函数地址指针(闭包)就可以了。
如
1 myfunc= proc{ puts "myfunc call"}
2 def mycall(&block)
3 block.call(self)
4 end
5 mycall(&myfunc)
6 ====> #myfunc call
这个就像是传入myfunc指针地址,处理。在ruby中好像是叫做传入对象,但是传入的object_id是一致的,说明传入的还是同一个对象。
如果要把一个自定义方法作为闭包传入到另一个方法中,如下:
def mymethod()
puts "mymethod"
end
def mycall(&block)
block.call(self)
end
mycall(&mymethod)
#报错 in `mymethod': undefined method `call' for # nil:NilClass (NoMethodError)
mycall(){ mymethod } #通过
上式中,如果把mymethod方法放在{}中,才能形成块包,则才能通过调用。
当然,mycall方法参数中必须带有允许带有你在后面加{}做块传递。
当在mycall查看块属性时,
def mycall(&block)
puts block.class
block.call(self)
end
不管你传入的是mymethod
,还是myfunc,则都显示为proc类型,
在上式中,当定义方法可传入闭包,则其调用是眼花缭乱的。
1 myblock = proc{ |i|
2 puts "call block..,#{i}"
3 }
4
5 def mymethod()
6 puts "call mymethod"
7 end
8
9 def myfunc(&func)
10 func.call(self)
11 end
12
13 def myfunc2(&func)
14 func.call("myfunc2 call " )
15 end
16
17 myfunc(&myblock)
18 myfunc(){ mymethod }
19 myfunc(){ myfunc2(&myblock)}
20 myfunc(){(1..10).each(&myblock)}
21 myfunc(){
22 (1..10).each(){
23 myfunc2(&myblock)
24 }
25 }
26