缩短Ruby中的if-else结构

时间:2013-08-15 17:38:16

标签: ruby

我写过这样的东西,我从Visual Basic 6.0中知道的if-else逻辑,但我确信有更好的“Ruby方式”来编写它。

你能告诉我Ruby世界的样子吗?

  if params[:medication_name].nil?
    med_name = 'all'
  elsif params[:medication_name] == 'undefined'
    med_name = 'all'
  else
    med_name = params[:medication_name]
  end

5 个答案:

答案 0 :(得分:7)

有几种不同的方法可以简化这一点,例如:

med_name = params[:medication_name]
med_name = 'all' if med_name.nil? or med_name == 'undefined'

答案 1 :(得分:4)

对于你的情况,这样的事情:

med_name = params[:medication_name] 
med_name = 'all' if [nil, 'undefined'].include? med_name

对于if / elsif / else的更一般的长链,请查看case statements。在这种情况下他们是矫枉过正,但这是一个例子:

med_name = case params[:med_name]
   when 'undefined', nil 
     'all'
   else
      params[:med_name]
end

答案 2 :(得分:2)

Ruby独有:

med_name = {nil=>'all', 'undefined'=>'all'}[params[:medication_name]] || params[:medication_name]

答案 3 :(得分:1)

你可以这样做:

val = [nil, 'undefined'].include?(params[:medication_name]) ? "all" : params[:medication_name]

答案 4 :(得分:1)

使用case语句是一种Ruby友好的方式。如果您正在检查一个值,则可以执行以下操作:

case params[:medication_name]
    when nil?
        med_name = 'all'
    when 'undefined'
        med_name = 'all'
    else
        med_name = params[:medication_name]
end

另一种方法是测试多个值:

foo = true
bar = false
case
    when foo == true
        puts "foo is true"
    when foo == false
        puts "foo is false"
    when bar == true
        puts "bar is true"
    when bar == false
        puts "bar is false"
    else
        puts "foo and bar are neither true or false!"
end