缩短 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 结构的主要内容,如果未能解决你的问题,请参考以下文章