[ruby-trunk - Bug #6396][Open] instance eval内での変数の扱いについて

Issue #6396 has been reported by uy (西行寺 うゆ).


Bug #6396: instance_eval内での変数の扱いについて
https://bugs.ruby-lang.org/issues/6396

Author: uy (西行寺 うゆ)
Status: Open
Priority: Normal
Assignee:
Category:
Target version:
ruby -v: ruby 1.9.3p194 (2012-04-20) [i386-mingw32]

class O
attr_accessor :x
end
o = O.new

o.x = 99

o.instance_eval do
p x #=> 99
if nil
x = 2 # この記述があるとxがnilになる
end
p x #=> nil
end

これはバグでしょうか?

o.instance_eval do
p x #=> 99
p x += 1
end
xは値を見ることは出来ても、
値を変更しようとしたり、
if分岐を通らなくても、そういったコードを混ぜておくと
xがnil(新しい変数?)に置き換わっているようですが

$B$$$^$$$G$9!#(B

From: uy ([email protected]>9T;{(B $B$&$f(B) <redmine_at_ruby-lang.org>
Date: Thu, 3 May 2012 20:39:09 +0900

o.instance_eval do
p x #=> 99
if nil
x = 2 # $B$3$N5-=R$,$"$k$H(Bx$B$,(Bnil$B$K$J$k(B
end
p x #=> nil
end

$B$3$l$O%P%0$G$7$g$&$+!)(B

($B:G=i$N(B) x $B$O%a%=%C%I8F$S=P$7$J$N$G!"0J2<$G$b:F8=$7$^$9!#(B

def x
99
end

p x # => 99
if nil
x = 2
end
p x # => nil

$B>e$N(B p x $B$N(B x $B$O%a%=%C%I8F$S=P$7$G$9$,!"<B9T$5$l$J$/$F$b(B x =
2 $B$N9T$rDL(B
$B2a$9$k$H(B x
$B$O(B($B=i4|2=$5$l$F$$$J$$(B)$B%m!<%+%kJQ?t$K$J$C$F$7$^$&$N$G!"2<$N(B
p x $B$N(B x $B$O%m!<%+%kJQ?t$K$J$C$F$$$^$9!#(B

$B85$N%3!<%[email protected]$H!"0J2<$N$h$&$K(B self [email protected]<($9$k$H(B 99
$B$,8+$($^$9$M!#(B

o.instance_eval do
p x # => 99
if nil
x = 2
end
p self.x # => 99
end

Issue #6396 has been updated by nobu (Nobuyoshi N.).

Description updated

=begin
一度 x への代入が現れれば、そのスコープではそこ以降では x というローカル変数が定義されていることになります。

これは構文解釈時に行われる判断なので、実際に代入されるかどうかは無関係です。

o.x へ代入したいのであれば、
o.x = 2

self.x = 2
としてください。
=end


Bug #6396: instance_eval内での変数の扱いについて
https://bugs.ruby-lang.org/issues/6396#change-26424

Author: uy (西行寺 うゆ)
Status: Open
Priority: Normal
Assignee:
Category:
Target version:
ruby -v: ruby 1.9.3p194 (2012-04-20) [i386-mingw32]

=begin
class O
attr_accessor :x
end
o = O.new

o.x = 99

o.instance_eval do
p x #=> 99
if nil
x = 2 # この記述があるとxがnilになる
end
p x #=> nil
end

これはバグでしょうか?

o.instance_eval do
p x #=> 99
p x += 1
end
((|x|))は値を見ることは出来ても、
値を変更しようとしたり、
(({if}))分岐を通らなくても、そういったコードを混ぜておくと
((|x|))が(({nil}))(新しい変数?)に置き換わっているようですが
=end

Issue #6396 has been updated by nobu (Nobuyoshi N.).

Status changed from Open to Rejected


Bug #6396: instance_eval内での変数の扱いについて
https://bugs.ruby-lang.org/issues/6396#change-26425

Author: uy (西行寺 うゆ)
Status: Rejected
Priority: Normal
Assignee:
Category:
Target version:
ruby -v: ruby 1.9.3p194 (2012-04-20) [i386-mingw32]

=begin
class O
attr_accessor :x
end
o = O.new

o.x = 99

o.instance_eval do
p x #=> 99
if nil
x = 2 # この記述があるとxがnilになる
end
p x #=> nil
end

これはバグでしょうか?

o.instance_eval do
p x #=> 99
p x += 1
end
((|x|))は値を見ることは出来ても、
値を変更しようとしたり、
(({if}))分岐を通らなくても、そういったコードを混ぜておくと
((|x|))が(({nil}))(新しい変数?)に置き換わっているようですが
=end