From: Marcin Raczkowski Date: 2007-11-14T05:21:42+09:00 Subject: Re: Shadowing bug?? Vasco Andrade e Silva wrote: > Hi, > > def f_ok(node) > func = lambda {|n| p(:in_lambda, n); n } > p node, func.call(node[:xpto]), node > end > >> f_ok({:xpto => "ohoh"}) > :in_lambda > "ohoh" > {:xpto=>"ohoh"} > "ohoh" > {:xpto=>"ohoh"} > > def f_ko(node) > func = lambda {|node| p(:in_lambda, node); node } > p node, func.call(node[:xpto]), node > end > >> f_ko({:xpto => "ohoh"}) > :in_lambda > "ohoh" > {:xpto=>"ohoh"} > "ohoh" > "ohoh" # ohoh... should be {:xpto=>"ohoh"}, or not?? > > I can't get any kind of explanation for this. Does anybody have one? > Why "node" in lambda isn't shadowed correctly (as i expected, at least)? > Well "node" is shadowed correctly but seems to be producing side > effects... > > Thanks, > Vasco Andrade e Silva I remember someone mentioned that it's possible to do some strange things in lambda (modyfing variable passed beeing one of them), but there's nothing in this funcition or lambda that would modify "node", i think there might be a scope problem that makes node variable in function beeing overvriten when part of node is in lambda irb(main):014:0> def f_ko(node) irb(main):015:1> func = lambda {|node| p(:in_lambda, node); node } irb(main):016:1> p node, func.call("bleh"), node irb(main):017:1> end => nil irb(main):018:0> f_ko({:xpto => "ohoh"}) :in_lambda "bleh" {:xpto=>"ohoh"} "bleh" "bleh" => nil this seems to confirm that using |node| will overwrite node in function, i'm not sure if it's intended scope behaviour tho