From: dblack@... Date: 2006-03-02T06:25:49+09:00 Subject: Re: case/when question Hi -- On Thu, 2 Mar 2006, cremes.devlist@mac.com wrote: > > On Mar 1, 2006, at 3:13 PM, cremes.devlist@mac.com wrote: > >> I was intrigued by the post that _why put up a few days/weeks ago about >> using case/when for testing arrays [1]. I thought I'd give it a try but I >> can't make it work. What am I doing wrong? >> >> irb(main):001:0> r1 = (0..12).to_a >> => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] >> irb(main):002:0> r2 = (20..32).to_a >> => [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32] >> irb(main):003:0> def foo range >> irb(main):004:1> case range >> irb(main):005:2> when *r1 >> irb(main):006:2> puts "#{range} in r1" >> irb(main):007:2> when *r2 >> irb(main):008:2> puts "#{range} in r2" >> irb(main):009:2> else >> irb(main):010:2* puts "#{range} NOT in any range" >> irb(main):011:2> end >> irb(main):012:1> end >> => nil >> irb(main):013:0> foo 3 >> NameError: undefined local variable or method `r1' for main:Object >> from (irb):5:in `foo' >> from (irb):13 > > Responding to my own email... > > I figured it out about 5 minutes after sending. This is purely a scope > mistake on my part. Variables r1 and r2 are NOT in scope inside foo which is > exactly what ruby told me. > > The fix is to make r1 and r2 into class vars. Change r1 to @r1 and r2 to @r2 > in that example and it works just fine. Sort of :-) Actually @r1 is an instance variable, not a class variable. It's true that if you do: @a = 1 def meth puts @a end meth you'll get "1", but only if you are writing code at the top level of the program. If you do this: class MyClass @a = 1 def meth puts @a end end MyClass.new.meth you won't because, the two @a's are different from each other. Class variables (@@r1) will cross the method-definition divide, but they're somewhat cumbersome.... The best thing is to create local variables in the scope where you need them (the method definition). David -- David A. Black (dblack@wobblini.net) Ruby Power and Light (http://www.rubypowerandlight.com) "Ruby for Rails" chapters now available from Manning Early Access Program! http://www.manning.com/books/black