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


#1

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.


#2

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]


#3

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.


#4

On Sun, Mar 1, 2009 at 19:01, Iñaki Baz C. removed_email_address@domain.invalid 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.


#5

2009/3/2 Gregory B. removed_email_address@domain.invalid:

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


#6

On Mon, Mar 2, 2009 at 9:23 AM, Iñaki Baz C. removed_email_address@domain.invalid
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


#7

On Sun, Mar 1, 2009 at 6:58 PM, Iñaki Baz C. removed_email_address@domain.invalid 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


#8

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.


#9

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


#10

On Mon, Mar 2, 2009 at 3:18 AM, Michal S. removed_email_address@domain.invalid
wrote:

2009/3/2 Gregory B. removed_email_address@domain.invalid:

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


#11

On Mon, Mar 2, 2009 at 10:38 AM, Ken B. removed_email_address@domain.invalid 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