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

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

1.8)

aaa = 123.capitalize rescue 444
=> 444

1.9)

aaa = 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
something?

Thanks a lot.

El Lunes, 2 de Marzo de 2009, Iñaki Baz C. escribió:

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:


begin
aaa = 123.capitalize
rescue
aaa = 444
end

=> 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]

El Lunes, 2 de Marzo de 2009, Iñaki Baz C. escribió:

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.

On Sun, Mar 1, 2009 at 19:01, Iñaki Baz C. [email protected] wrote:

rescue

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

miro:~ brian$ irb19

aaa = 123.capitalize rescue 444
=> 444
miro:~ brian$ ruby19 -v
ruby 1.9.2dev (2009-03-02 trunk 22700) [i386-darwin9.6.0]

Brian.

2009/3/2 Gregory B. [email protected]:

But please, don’t use this technique. Â It creates huge debugging nightmares.

Instead, just do:

aaa = 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

On Mon, Mar 2, 2009 at 9:23 AM, Iñaki Baz C. [email protected]
wrote:

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.

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

^ manveru

On Sun, Mar 1, 2009 at 6:58 PM, Iñaki Baz C. [email protected] wrote:

1.9)

aaa = 123.capitalize rescue 444
NoMethodError: undefined method `capitalize’ for 123:Fixnum

RUBY_VERSION
=> “1.9.1”
123.captialize rescue 444
=> 444

But please, don’t use this technique. It creates huge debugging
nightmares.

Instead, just do:

aaa = obj.respond_to?(:capitalize) ? obj.capitalize : 444

Michal S. wrote:

aaa = obj.respond_to?(:capitalize) ? obj.capitalize : 444

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.

On Mon, 02 Mar 2009 09:36:10 -0500, Gregory B. wrote:

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

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

On Mon, Mar 2, 2009 at 3:18 AM, Michal S. [email protected]
wrote:

2009/3/2 Gregory B. [email protected]:

But please, don’t use this technique. It creates huge debugging nightmares.

Instead, just do:

aaa = obj.respond_to?(:capitalize) ? obj.capitalize : 444

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

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

-greg

On Mon, Mar 2, 2009 at 10:38 AM, Ken B. [email protected] wrote:

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