如何在Ruby中编写switch语句?
当前回答
这是在Ruby中使用case完成的。另请参阅维基百科上的“Switch语句”。
引用:
case n
when 0
puts 'You typed zero'
when 1, 9
puts 'n is a perfect square'
when 2
puts 'n is a prime number'
puts 'n is an even number'
when 3, 5, 7
puts 'n is a prime number'
when 4, 6, 8
puts 'n is an even number'
else
puts 'Only single-digit numbers are allowed'
end
另一个例子:
score = 70
result = case score
when 0..40 then "Fail"
when 41..60 then "Pass"
when 61..70 then "Pass with Merit"
when 71..100 then "Pass with Distinction"
else "Invalid Score"
end
puts result
在我的Kindle上的《Ruby编程语言》(第一版,O'Reilly)第123页左右,它说when子句后面的then关键字可以用换行符或分号替换(就像if-then-else语法中的那样)。(Ruby 1.8也允许用冒号代替then,但Ruby 1.9中不再允许使用这种语法。)
其他回答
许多编程语言,特别是源于C的语言,都支持所谓的Switch Fallthrough。我正在寻找在Ruby中实现这一点的最佳方法,并认为这可能对其他人有用:
在类C语言中,故障通常如下所示:
switch (expression) {
case 'a':
case 'b':
case 'c':
// Do something for a, b or c
break;
case 'd':
case 'e':
// Do something else for d or e
break;
}
在Ruby中,同样可以通过以下方式实现:
case expression
when 'a', 'b', 'c'
# Do something for a, b or c
when 'd', 'e'
# Do something else for d or e
end
这并不是严格等价的,因为不可能让“a”在变成“b”或“c”之前执行一块代码,但在大多数情况下,我发现它足够相似,以同样的方式有用。
在Ruby中,可以用两种不同的方式编写case表达式:
类似于一系列if语句在case旁边指定一个目标,并将每个when子句与目标进行比较。
age = 20
case
when age >= 21
puts "display something"
when 1 == 0
puts "omg"
else
puts "default condition"
end
or:
case params[:unknown]
when /Something/ then 'Nothing'
when /Something else/ then 'I dont know'
end
如果您渴望知道如何在Ruby开关情况下使用OR条件:
因此,在case语句中,a相当于if语句中的||。
case car
when 'Maruti', 'Hyundai'
# Code here
end
请参阅“Ruby Case语句的工作原理和使用它可以做什么”。
Ruby支持case表达式。
类匹配:
case e = StandardError.new("testing")
when Exception then puts "error!"
else puts "ok!"
end # => error!
多值匹配:
case 3
when 1,2,3 then puts "1..3"
when 4,5,6 then puts "4..6"
else puts "?"
end # => 1..3
Regex评估:
case "monkey"
when /mon/ then puts "banana"
else puts "?"
end # => banana
根据您的情况,您可能更喜欢使用方法散列。
如果有一个很长的时间列表,并且每个时间都有一个具体的值可以比较(而不是一个间隔),那么声明一个方法散列,然后从散列中调用相关的方法会更有效。
# Define the hash
menu = {a: :menu1, b: :menu2, c: :menu2, d: :menu3}
# Define the methods
def menu1
puts 'menu 1'
end
def menu2
puts 'menu 2'
end
def menu3
puts 'menu3'
end
# Let's say we case by selected_menu = :a
selected_menu = :a
# Then just call the relevant method from the hash
send(menu[selected_menu])
推荐文章
- Rails中的OO设计:在哪里放置东西
- 给定一个类,查看实例是否有方法(Ruby)
- 在日历应用程序中建模重复事件的最佳方法是什么?
- 如何创建一个私有类方法?
- 无法安装pg gem
- 双* (splat)操作符做什么
- 如何使用Ruby on Rails进行HTTP请求?
- 如何从rake任务中提前返回?
- 什么&。(&点)在Ruby中是什么意思?
- 是什么阻碍了Ruby和Python获得V8的Javascript速度?
- 如何使用开关案件'或'在PHP
- 运行pod设置给我“坏的解释器:没有这样的文件或目录”错误
- 在Ubuntu上安装sqlite3-ruby错误
- Ruby有什么Python没有的,反之亦然?
- find_spec_for_exe':无法找到gem bundle (>= 0.a) (gem::GemNotFoundException)