Ruby ruby 的 Block,Proc,Lambda ---3

zputee · 2013年04月24日 · 3466 次阅读

一、’Proc 类的对象‘和对象的’method‘关系

  1. Proc 类的对象运行在定义时程序的 Context。
  2. 对象的 method 运行在对象的 Context。
  3. 对象的 method 是 Method 类的实例。
  4. 它们可与相互转换。
  5. 由 method 转换到 Proc 类的对象时,不绑定当前域的局部变量。

二、method 转到 Proc 的对象

def plus(a,b)
  a + b
end
method(:plus).methods.grep /^to./  # to_proc 方法
p1=method(:plus).to_proc           # 转换为
p1.class                           # Proc的对象

def math(a,b)                      #在函数中使用上面生成的p1
  yield(a,b)
end
puts math(2,3,&p1) 
#=>5

p2=method(:plus)               # 2013.4.25    
puts math(2,3,&p)              #default call  to_proc method
$=>5

[1,2,3].map(&:to_s)            #2013,4.25
#=>["1", "2", "3"]
#其中 &:to_s  ===>   proc{ | o | o.send(self) }

三 Proc 的对象转到 method

p1 = proc{p 'hi,world'}

class A
end
a = A.new
#1.添加类的实例方法
A.send(:define_method, :hi, &p1)   
A.instance_methods(false)  
a.hi   #=>"hi,world"
#2.添加为类方法
A.singleton_class.send(:define_method, :hi, &p1)
A.methods(false)
A.hi   #=>"hi,world"
zputee ruby 的 Block,Proc,Lambda ---4 提及了此话题。 04月03日 10:56
zputee 聊聊 Ruby 中的 block, proc 和 lambda 提及了此话题。 05月08日 10:44
需要 登录 后方可回复, 如果你还没有账号请 注册新账号