--0015175d675c8b06c7046ef25e35
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Matz,
One of the biggest breaking changes in Ruby 1.9 is the change in constant
lookup inside a proc that is *_eval'ed.
For instance,
*1.8*
*
*
class Foo
class Bar
end
def evaluate(&blk) instance_eval(&blk) end
end
Foo.new.evaluate { Bar }
NameError: uninitialized constant Bar
*1.9*
class Foo
class Bar
end
def evaluate(&blk) instance_eval(&blk) end
end
Foo.new.evaluate { Bar }
Foo::Bar
The 1.9 behavior is understandable if everything is in one file. However, in
the normal case, instance_eval is used to implement DSLs. For instance,
rspec has the following semantics:
module RubyFun
class Foo
end
describe ("Foo") do
it("exists") do
lambda { Foo }.should_not raise_error
end
end
dnc
This test passes in 1.8 but not in 1.9 because of the change in behavior. It
also clearly articulates the *reason* for the 1.8 behavior: it is more the
expected behavior. One of the things that's great about Ruby is that it
focuses on programmer understanding, even if that is sometimes slow. This is
a case where the programmer expects to see a constant but it is being looked
up somewhere the programmer knows nothing about. I think it is clear that
the old behavior is better, even if it is harder to implement. Additionally,
both JRuby and Rubinius were able to implement the old behavior in a
compiled system, so it should be possible.
Thanks for your time.
--
Yehuda Katz
Developer | Engine Yard
(ph) 718.877.1325
--0015175d675c8b06c7046ef25e35
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Matz,<div><br></div><div>One of the biggest breaking changes in Ruby 1.9 ishe change in constant lookup inside a proc that is *_eval'ed.</div><div><br></div><div>For instance,</div><div><br></div><div><div><b>1.8</b></div>
<div><b><br></b></div><div>class Foo</div><div> class Bar</div><div> end</div><div> def evaluate(&blk) instance_eval(&blk) end</div><div>end</div><div><br></div><div>Foo.new.evaluate { Bar }</div><div>NameError: uninitialized constant Bar</div>
<div><br></div><div><b>1.9</b></div><div><br></div><div>class Foo</div><div> class Bar</div><div> end</div><div> </div><div> def evaluate(&blk) instance_eval(&blk) end</div><div>end</div><div><br></div><div>Foo.new.evaluate { Bar }</div>
<div>=> Foo::Bar</div><div><br></div><div><br></div><div>The 1.9 behavior is understandable if everything is in one file. However, in the normal case, instance_eval is used to implement DSLs. For instance, rspec has the following semantics:</div>
<div><br></div><div>module RubyFun</div><div> class Foo</div><div> end</div><div><br></div><div> describe ("Foo") do</div><div> ¨Âô¨¦ñõïô»åøéóôó¦ñõïô»äOäéö¾¼äéö¤Â ¨ÂáíâäÆïï®óèïõìäßîïô òáéóåßåòòïò¼¯äéö
<div> ¨Âî伯äéö¾¼äéö¤Â end</div><div>dnc</div><div><br></div><div>This test passes in 1.8 but not in 1.9 because of the change in behavior. It also clearly articulates the <b>reason</b> ¨Âïò ôè±®âåèáöéïòéô éó íïòå ôèåøðåãôåä âåèáöéïòÏîïæ ôèôèéîçó ôèáô¦£³¹»ó çòåááâïõÒõâù éó ôèáô éô æïãõóåïî ðòïçòáííåò õîäåòóôáîäéîç¬ åöåî éæ ôèáô éó óïíåôéíåóìï÷Ôèéó éó ãáóå ÷èåòôèðòïçòáííåò åøðåãôôï óåãïîóôáîô âõéôâåéîìïïëåä õð óïíå÷èåòôèðòïçòáííåò ëîï÷îïôèéîáâïõô® ôèéîéô éó ãìåáôèáô ôèïìâåèáöéïò éó âåôôåòåöåî éæ éô éó èáòäåò ôï éíðìåíåîô® Áääéôéïîáììùâïôè ÊÒõâáîÒõâéîéõó ÷åòå áâìå ôï éíðìåíåîôèïìâåèáöéïò éî ãïíðéìåä óùóôåíóï éô óèïõìä âå ðïóóéâì宼¯äéö
<div><br></div><div>Thanks for your time.</div><br>-- <br>Yehuda Katz<br>Developer | Engine Yard<br>(ph) 718.877.1325<br>
</div>
--0015175d675c8b06c7046ef25e35--