Ruby Case Statement不断进步

时间:2016-11-17 04:50:57

标签: ruby

我正在尝试将特殊符号( {W} {B} {U} 等)转换为各自的颜色,所以我写了一个案例,但我在想一个案例不是什么我需要它,因为它一找到匹配就结束了。

print 'Test a Color'
color = gets.chomp

case color
when '{W}'
  puts 'White'
when '{R}'
  puts 'Red'
when '{G}'
  puts 'Green'
when '{U}'
  puts 'Blue'
when '{B}'
  puts 'Black'
end

{B} 让我黑色 {U} 获取 Blue {U} {B} 崩溃它/什么都不返回。 我怎么会让它继续下去呢?

4 个答案:

答案 0 :(得分:7)

检查以下内容。

print "Test a Color"
color = gets.chomp

hash = {
  '{W}' => 'White',
  '{R}' => 'Red'
}

# finding by regex and replace with what you want.
puts color.gsub(/\{.+?\}/){|k| hash[k] || k }

答案 1 :(得分:2)

this.me =  [{name: 'shameem', age: 18}]

答案 2 :(得分:2)

买者

以下不是最有效或惯用的解决方案。但是,它通过对现有代码进行一些简单的改进,同时保留当前的语义来解决您的问题。

循环你的案例陈述

此解决方案读取标准输入并将其转换为存储在 colors 中的Array对象,然后循环遍历该数组中每个元素的case语句。

print "Test a Color: "
colors = gets.chomp.scan /\{[WRGUB]\}/
colors.each do |color|
  case color
  when "{W}"
    puts "White"
  when "{R}"
    puts "Red"
  when "{G}"
    puts "Green"
  when "{U}"
    puts "Blue"
  when "{B}"
    puts "Black"
  end
end

这将导致输出类似于以下内容:

$ ruby colors.rb 
Test a Color: {W}{B}
White
Black

答案 3 :(得分:1)

虽然@xdazz的答案可以解决问题,但它并不是非常俗气的:

hash = %w|W R G U B|.map { |e| "{#{e}}"}
                    .zip(%w|White Red Green Blue Black|)
                    .to_h

print "Test a Color"
# color = gets.chomp
color = "Hello, {W}, I am {B}!"
puts color.gsub(Regexp.union(hash.keys), hash)
#⇒ Hello, White, I am Black!

我们在这里使用String#gsub(pattern, hash)