From: Robert Klemme Date: 2007-11-16T19:23:21+09:00 Subject: Re: Shadowing bug?? 2007/11/15, Vasco Andrade e Silva : > Robert Klemme wrote: > > 2007/11/14, Vasco Andrade e Silva : > >> > > >> 1 > >> > >> > f_ko({:xpto => "ohoh"}) > >> :in_lambda > >> "ohoh" > >> {:xpto=>"ohoh"} > >> "ohoh" > >> {:xpto=>"ohoh"} # :-) > > > > Just let me add that even though this is fixed IMHO it is a bad idea > > to use the same identifier in both cases if you want to keep them > > separate. This can likely cause confusion. > > I don't agreed with you. Shadowing, IMHO, is a very useful (and > powerful) way to express semantic and execute "best practices". > > Example: > Imagine you want to process a tree (as i wanted). Suppose that in the > process of that computation you call "defn_to_sexp". This method > receives a node (tagged with :defn). > In this case i wanted to do a "special" process to the args branch of > the tree. So, and because i didn't want to declare another function > visible from class scope, i created a proc (process_args). This proc > should receive the tree branch (i.e. "node") and other variable witch > represents a computation over some other branch of defn's node. > > Here goes a simple sample: > def defn_to_sexp(node) > process_args = lambda do |n, has_block| > ... > end > ... > has_block = process(...) > process_args.call(args_node(node), hash_block) > ... > end > > i have more semantic if i can call the word "node" instead of the word > "n" in lambda's arg: I want to shadow the node variable. > This is a case, IMHO, where it's a good idea "to use the same identifier > in both cases". > > In this case i would wanted to write: > def defn_to_sexp(node) > process_args = lambda do |node, has_block| > ... # i don't want to access to the outer node > # and "node" says more than "n" > end > ... > has_block = process(...) > process_args.call(args_node(node), hash_block) > ... > end IMHO you are abusing a lambda to get a nested method. This likely also has performance impacts since the block has to be recreated on every invocation of the method. In this case I'd rather use a private helper method. But I can see how you would want to use the same identifier in some cases. I can only speak for myself: I did not feel the urge to do this (yet). Cheers robert -- use.inject do |as, often| as.you_can - without end