2013-02-22 81 views

回答

3

您已經做對了。只需使用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> 
1

在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