新井です。

In message "[ruby-list:34885] creating a scope / anonymous module"
  on 13 Apr 2002 23:39:14 +0900,
  Takaaki Tateishi <ttate / kt.jaist.ac.jp> wrote:
> 立石です.
> 
> Rubyでスコープの終了を明示したい場合,皆さんどのようにしていますか?
> このような状況になったとき,変数名を変えたり,何か余計な操作とともに

基本的にそのような状況になったことはないのですが、

> ブロックを作ったりすると思うのですが他に何かよい方法はあるのでしょう
> か? 以下のような感じで書けることを期待しています.
> 
> local
>   a = 1
>   ... # a が有効
> end
> ...   # a は無効

ruby に関してまだ若かりしころに [ruby-dev:3642] で

def dummyscope
  binding
end

a = 0

eval %q{
  a = 1
  p a		# => 1
}, dummyscope

p a		# => 0

というのを考えたことがあります。

むっ?以下のようにすると ruby 1.7 では、エラーメッセージが2回重なって出るな。

def dummyscope
  binding
end

eval %q{p a}, dummyscope

=> (eval):1:in `dummyscope': undefined local variable or method `a' for #<Object:0x401beaec>: (eval):1:in `dummyscope': undefined local variable or method `a' for #<Object:0x401beaec> (NameError)
   	from -:2:in `dummyscope'
   	from -:5
   ruby 1.7.2 (2002-04-12) [i586-linux]

=> -:5:in `eval': (eval):1:in `dummyscope': undefined local variable or method `a' for #<Object:0x401bece0> (NameError)
   	from -:5
   ruby 1.6.7 (2002-04-11) [i586-linux]

> 同時に,この local..end の間であるモジュールをincludeされても,その外
> では include の効果は無視されるようにもして欲しいです.
> 
> local
>   include Foo
>   ...    # include Fooが有効
> end
> ...      # include Foo は無効
> 
> 結果的に,効果は名前のないモジュールと考えてもらえればいいのですが…

a = 0 

class <<Object.new
  a = 1
  p a		# => 1

  include Math
  p PI		# => 3.141592654
end

p a		# => 0
p PI		# => uninitialized constant PI (NameError)

とか。これは、[ruby-dev:3645] からヒントを得ました。

でも、使ったことはないです。(わかりにくいという点であんま勧
められるものでもないですよね)

--
新井康司 (Koji Arai)