るびきちです。

警告「shadowing outer local variable」はなくすべきだと思います。
そもそも原因は1.8までのブロック引数の仕様がひどかったからです。
警告を消すには1.8まで同様たとえ1文のブロックであっても
ブロック引数の名前を変更しないといけなくなります。
これはかなりストレスがたまります。
善し悪しは別として同じ変数名を使うのはLispやC言語でも普通に行われています。

むしろこの警告は1.8につけるべきです。

RUBY_VERSION                    # => "1.9.0"
RUBY_RELEASE_DATE               # => "2008-02-20"
a = 1
b = [1,2].map{|a| a*2}          # => [2, 4] # !> shadowing outer local variable - a


(let ((a 1) b)
  (setq b (mapcar (lambda (a) (* a 2)) '(1 2)))
  (list a b))                           ; => (1 (2 4))


diff -u /home/nobackup/compile/ruby19/parse.c.orig /home/nobackup/compile/ruby19/parse.c
--- /home/nobackup/compile/ruby19/parse.c.orig	2008-02-22 00:43:34.000000000 +0900
+++ /home/nobackup/compile/ruby19/parse.c	2008-02-22 00:42:47.000000000 +0900
@@ -12790,7 +12790,6 @@
 	    yyerror("duplicated argument name");
 	}
 	else if (dvar_defined(name) || local_id(name)) {
-	    rb_warningS("shadowing outer local variable - %s", rb_id2name(name));
 	    vtable_add(lvtbl->vars, name);
 	}
     }

--
rubikitch
Blog: http://d.hatena.ne.jp/rubikitch/
Site: http://www.rubyist.net/~rubikitch/