缩短 Ruby 中的 if-else 结构

Posted

技术标签:

【中文标题】缩短 Ruby 中的 if-else 结构【英文标题】:Shortening an if-else structure in Ruby 【发布时间】:2013-08-17 23:28:10 【问题描述】:

我已经写过类似的东西,与我从 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

【问题讨论】:

并不是更好的“红宝石方式”,但您可以尝试使用三元语句。 您至少可以将defined? 用于第二个分支 见***.com/q/948135/128421。 旁注:在 Ruby 中将作业移至条件结果的结果是最佳实践。 gist.github.com/anonymous/bf0ba38c44968399766ada48076c9222 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

Ruby 独有:

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

【讨论】:

【参考方案4】:

你可以这样做:

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

【讨论】:

【参考方案5】:

使用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

【讨论】:

以上是关于缩短 Ruby 中的 if-else 结构的主要内容,如果未能解决你的问题,请参考以下文章

R语言中的if else语句

2.7 Go语言中的if-else

js中的分支与循环

if-else分支结构

Week_02_Java中的选择结构

在Spring boot项目中使用策略模式消除if-else