[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Case with strings

Aquila

3/19/2005 3:59:00 PM

A similar problem:
case key.strip
when "c" "Synopsis"
when "s" "Category"
when "io" "Inputs and outputs"
when "processing" "Processing type"
when "d" "Description"
when "n" "Notes"
when "e" "Examples"
when "h" "Element handlers"
when "a" "See also"
else puts "Unknown key"
end
if key.strip == "a"
puts "This gives output"
end
unknown key
This gives output

What am I doing wrong? I'm a really Ruby newbie so probably I'm looking at
it the wrong way...
--
"May the source be with you"
4 Answers

Florian Gross

3/19/2005 4:29:00 PM

0

Aquila wrote:

> case key.strip
> when "c" "Synopsis"
> when "s" "Category"
> when "io" "Inputs and outputs"
> when "processing" "Processing type"
> when "d" "Description"
> when "n" "Notes"
> when "e" "Examples"
> when "h" "Element handlers"
> when "a" "See also"
> else puts "Unknown key"
> end
> if key.strip == "a"
> puts "This gives output"
> end
> unknown key
> This gives output
>
> What am I doing wrong? I'm a really Ruby newbie so probably I'm looking at
> it the wrong way...

You forget to put "puts" before you're Strings. This will work:

case key.strip
when "c" puts "Synopsis"
when "s" puts "Category"
...
end

And this will also work and require less repetition:

puts case key.strip
when "c": "Synopsis"
when "s": "Category"
...
end

Though I wonder if you're not better of with a Hash:

puts({
"c" => "Synopsis",
"s" => "Category",
...
}[key.strip])

Aquila

3/19/2005 4:49:00 PM

0

Florian Gross wrote:

<snip>
> And this will also work and require less repetition:
>
> puts case key.strip
> when "c": "Synopsis"
> when "s": "Category"
> ...
> end
>

Actually the code has less duplication, this was just an example. But why
doesn't this work:
def keyToName(key)
case key.strip
....
when "h" "Element handlers"
when "a" "See also"
else "Unknown key"
end
end

puts keyToName("a")
puts keyToName('a')
It gives "Unknown key" twice, instead of "See also" at least once.

> Though I wonder if you're not better of with a Hash:
>
> puts({
> "c" => "Synopsis",
> "s" => "Category",
> ...
> }[key.strip])

That sounds nice, is that code faster?

Thanks for your help
--
"May the source be with you"

Florian Gross

3/19/2005 4:58:00 PM

0

Aquila wrote:

> Actually the code has less duplication, this was just an example. But why
> doesn't this work:
> def keyToName(key)
> case key.strip
> ...
> when "h" "Element handlers"
> when "a" "See also"
> else "Unknown key"
> end
> end
>
> puts keyToName("a")
> puts keyToName('a')
> It gives "Unknown key" twice, instead of "See also" at least once.

Hah, I knew that you weren't supposed to use when like that. You're
actually doing this with the above code:

case key.strip
when "hElement handlers"
when "aSee also"
else "Unknown key"
end

Which of course isn't what you want. Put a "then" or ":" between the
condition and the action parts and it will work.

>>Though I wonder if you're not better of with a Hash:
>>
>>puts({
>> "c" => "Synopsis",
>> "s" => "Category",
>> ...
>>}[key.strip])
>
> That sounds nice, is that code faster?

It ought to be faster, especially when you assign the Hash to a
constant, but I doubt that it will matter much.

Malte Milatz

3/19/2005 5:00:00 PM

0

Aquila:
> case key.strip
> when "c" "Synopsis"

# You need the keyword 'then' here.

when 'c' then 'Synopsis'
# or alternatively:
when 'c'; 'Synopsis'

# And you're likely to write something like this:

answer = case key.strip
when 'c' then 'Synopsis'
# etc.
end
# now work with answer

# Consider, too, using a hash. It does what you want in a very direct and
# clean way.

# Malte