1
p = Proc.new{ |v| puts v }
p(5) #=> 5
這工作得很好,但如果我想「綁定」V所以它動態更新。例如:如何將變量傳遞給動態更新的Ruby proc?
p = Proc.new{ ... puts v }
v = 5
p #=> 5
v = 7
p #=> 7
p = Proc.new{ |v| puts v }
p(5) #=> 5
這工作得很好,但如果我想「綁定」V所以它動態更新。例如:如何將變量傳遞給動態更新的Ruby proc?
p = Proc.new{ ... puts v }
v = 5
p #=> 5
v = 7
p #=> 7
您已經做對了。只需使用call來執行你的proc:
irb(main):001:0> v= 42
=> 42
irb(main):002:0> p= Proc.new{ puts v }
=> #<Proc:[email protected](irb):2>
irb(main):003:0> p.call
42
=> nil
irb(main):004:0> v= 43
=> 43
irb(main):005:0> p.call
43
=> nil
irb(main):006:0>
在proc之前聲明該變量。當proc創建時,它會考慮已經聲明的任何局部變量。
由於變量是在proc之後聲明的,所以出錯。
1.9.3p327 :001 > p = Proc.new { puts a }
=> #<Proc:[email protected](irb):1>
1.9.3p327 :002 > p.call()
NameError: undefined local variable or method `a' for main:Object
from (irb):1:in `block in irb_binding'
from (irb):2:in `call'
from (irb):2
from /home/chris/.rvm/rubies/ruby-1.9.3-p327/bin/irb:16:in `<main>'
1.9.3p327 :003 > a = 1
=> 1
1.9.3p327 :004 > p.call()
NameError: undefined local variable or method `a' for main:Object
from (irb):1:in `block in irb_binding'
from (irb):4:in `call'
from (irb):4
from /home/chris/.rvm/rubies/ruby-1.9.3-p327/bin/irb:16:in `<main>'
這適用於在proc之前聲明的變量。
1.9.3p327 :001 > a = 1
=> 1
1.9.3p327 :002 > p = Proc.new { puts a }
=> #<Proc:[email protected](irb):2>
1.9.3p327 :003 > p.call()
1
=> nil
1.9.3p327 :004 > a = 2
=> 2
1.9.3p327 :005 > p.call()
2
=> nil