Rub 1.9: "inline rescue" doesn't work?

  • Thread starter Iñaki Baz Castillo
  • Start date
I

Iñaki Baz Castillo

Hi, is there any explanation for the folowing big difference between the sa=
me=20
code in 1.8 and 1.9?:


1.8)

aaa =3D 123.capitalize rescue 444
=3D> 444


1.9)

aaa =3D 123.capitalize rescue 444
NoMethodError: undefined method `capitalize' for 123:Fixnum


It seems that Ruby 1.9 doesn't react on "inline rescue" as 1.8. Do I miss=20
something?

Thanks a lot.



=2D-=20
I=C3=B1aki Baz Castillo
 
I

Iñaki Baz Castillo

El Lunes, 2 de Marzo de 2009, I=C3=B1aki Baz Castillo escribi=C3=B3:
It seems that Ruby 1.9 doesn't react on "inline rescue" as 1.8. Do I miss
something?

Well, it must be something even worse since block rescue neither works:

=2D----------------
begin
aaa =3D 123.capitalize
rescue
aaa =3D 444
end
=2D-----------------
=3D> NoMethodError: undefined method `capitalize' for 123:Fixnum


Perhaps it's due to the not updated version of Ruby1.9 I'm using?:

$ irb1.9 -v
irb 0.9.5(05/04/13)

$ ruby1.9 -v
ruby 1.9.0 (2007-08-30 patchlevel 0) [i486-linux]


=2D-=20
I=C3=B1aki Baz Castillo
 
I

Iñaki Baz Castillo

El Lunes, 2 de Marzo de 2009, I=C3=B1aki Baz Castillo escribi=C3=B3:
Perhaps it's due to the not updated version of Ruby1.9 I'm using?:

$ irb1.9 -v
irb 0.9.5(05/04/13)

$ ruby1.9 -v
ruby 1.9.0 (2007-08-30 patchlevel 0) [i486-linux]

Yes, it seems to be an old bug in my 1.9 version. I've upgraded to:

$ ruby1.9 -v
ruby 1.9.0 (2007-12-25 revision 14709) [i486-linux]

and the "rescue" issue has gone.


=2D-=20
I=C3=B1aki Baz Castillo
 
B

Brian Mitchell

El Lunes, 2 de Marzo de 2009, I=C3=B1aki Baz Castillo escribi=C3=B3:
It seems that Ruby 1.9 doesn't react on "inline rescue" as 1.8. Do I mis= s
something?

Well, it must be something even worse since block rescue neither works:

-----------------
begin
=C2=A0 =C2=A0 =C2=A0 =C2=A0aaa =3D 123.capitalize
rescue
=C2=A0 =C2=A0 =C2=A0 =C2=A0aaa =3D 444
end
------------------
=3D> NoMethodError: undefined method `capitalize' for 123:Fixnum


Perhaps it's due to the not updated version of Ruby1.9 I'm using?:

=C2=A0$ irb1.9 -v
=C2=A0irb 0.9.5(05/04/13)

=C2=A0$ ruby1.9 -v
=C2=A0ruby 1.9.0 (2007-08-30 patchlevel 0) [i486-linux]

miro:~ brian$ irb19=3D> 444
miro:~ brian$ ruby19 -v
ruby 1.9.2dev (2009-03-02 trunk 22700) [i386-darwin9.6.0]

Brian.
 
G

Gregory Brown

Hi, is there any explanation for the folowing big difference between the = same
code in 1.8 and 1.9?:


1.8)

aaa =3D 123.capitalize rescue 444
=3D> 444


1.9)

aaa =3D 123.capitalize rescue 444
NoMethodError: undefined method `capitalize' for 123:Fixnum
=3D> 444

But please, don't use this technique. It creates huge debugging nightmares=
 
M

Michal Suchanek

2009/3/2 Gregory Brown said:
=3D> 444

But please, don't use this technique. =C2=A0It creates huge debugging nig= htmares.

Instead, just do:

aaa =3D obj.respond_to?:)capitalize) ? obj.capitalize : 444
I'd see it as a Ruby's failure that the proper check is against DRY.

Thanks

Michal
 
M

Michael Fellinger

El Lunes, 2 de Marzo de 2009, I=C3=B1aki Baz Castillo escribi=C3=B3:
Perhaps it's due to the not updated version of Ruby1.9 I'm using?:

=C2=A0 $ irb1.9 -v
=C2=A0 irb 0.9.5(05/04/13)

=C2=A0 $ ruby1.9 -v
=C2=A0 ruby 1.9.0 (2007-08-30 patchlevel 0) [i486-linux]

Yes, it seems to be an old bug in my 1.9 version. I've upgraded to:

=C2=A0$ ruby1.9 -v
=C2=A0ruby 1.9.0 (2007-12-25 revision 14709) [i486-linux]

and the "rescue" issue has gone.

That's still ancient. The latest revision is 22705 and the last stable
release was 1.9.1.

^ manveru
 
P

Phlip

I'd see it as a Ruby's failure that the proper check is against DRY.

DRY is most egregious when the duplicated components are far apart from each
other. (And hence harder to spot!) Duplicating things right next to each other
is Mostly Harmless, and it's always the next best thing if you can't think of
the final refactor.
 
G

Gregory Brown

K

Ken Bloom

Agreed, but the costs of the elegance of using rescue as a conditional
modifier stack up fast in any moderately complex system.

-greg


The problem with the rescue modifier is that it lumps all types of errors
into one relatively blunt tool. A rescue(Type) modifier would really
help, and a ?. operator (like Groovy's) would resolve one of the most
common cases for a rescue modifier.

--Ken
 
G

Gregory Brown

The problem with the rescue modifier is that it lumps all types of errors
into one relatively blunt tool. A rescue(Type) modifier would really
help, and a ?. operator (like Groovy's) would resolve one of the most
common cases for a rescue modifier.

Right, if you could do:

obj.capitalize rescue(NoMethodError) 42

it'd remove the debugging issue. However, this does force the
interpreter to do a whole lot of extra work raising and rescuing an
error unnecessarily.

Groovy's ?. looks about right in terms of what we really want most of
the time rescue is used as a conditional modifier.
In the past, I've implemented this as:

class Object
def try(sym, *args)
return if nil?
send(sym, *args) if respond_to?(sym)
end
end

then, you get:

a = obj.try:)capitalize) || 42

But there are obviously some other limitations here...

-greg
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,535
Members
45,008
Latest member
obedient dusk

Latest Threads

Top