kenlistian

勤学多思

  IT博客 :: 首页 :: 新随笔 ::  :: 聚合  :: 管理 ::
  207 随笔 :: 0 文章 :: 23 评论 :: 0 Trackbacks

我曾经笔记过闭包和块的概念。

闭包:理解为一段代码,能作为参数传递给其它方法。
块: 相当是一个匿名函数。

感觉理解把它当做是函数体(块)或函数地址指针(闭包)就可以了。

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 



posted on 2008-03-26 16:37 kenlistian 阅读(170) 评论(1)  编辑 收藏 引用

评论

# re: 闭包和块之二 2008-03-27 00:21 kenlistian
看了下ruby陷阱


def func
puts “test”
end

pro1=proc {|i| puts i * i }

其中也可以这样调用
func(&pro1)
:(

or在
def func
yield(2)
end
代入闭包处理,
还有方法后面是可以带闭包操作的。就是说在定义一个
def method()
都是允许跟块的。




学习中。  回复  更多评论
  

只有注册用户登录后才能发表评论。