Case with strings

A

Aquila

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...
 
F

Florian Gross

Aquila said:
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])
 
A

Aquila

Florian Gross wrote:

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
 
F

Florian Gross

Aquila said:
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.
 
M

Malte Milatz

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
 

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,769
Messages
2,569,576
Members
45,054
Latest member
LucyCarper

Latest Threads

Top