我需要使用一些范围来编写一个案例,以便更好地编写类似以下意大利面条代码的内容:
if $mem < 1024 { $retvalue = "128M" } elsif $mem < 7000 { $retvalue = "160M" } elsif $mem < 15000 { $retvalue = "192M" } elsif $mem < 31000 { $retvalue = "256M" } else { $retvalue = "512M" }
是否可以通过使用范围函数(在 stdlib 上)或比这更好的方法使用 case 语句?
BR
Giuseppe
答案1
对于这种数量级的范围,我建议不要创建范围(即,充满用于扫描的整数值的数组)。
你的方法很可靠。如果你真的想要一个 case 语句,你可以使用一段 Ruby 代码和函数inline_template
,但这会降低性能,而且在可维护性方面也没有太大的提升。
答案2
Puppet 的case
语句可以评估表达式并且会运行与第一个匹配的案例相关的第一个表达式。
它并不完全支持这一点:
case $mem {
0..1023: { $retvalue = "128M" }
1024..6999: { $retvalue = "160M" }
7000...14999: { $retvalue = "192M" }
15000..30999: { $retvalue = "256M" }
default: { $retvalue = "512M" }
}
但是你可以给它表达式并告诉它匹配第一个true
。
那么你能做这个:
case true {
$mem < 1024: { $retvalue = "128M" }
$mem < 7000: { $retvalue = "160M" }
$mem < 15000: { $retvalue = "192M" }
$mem < 31000: { $retvalue = "256M" }
default: { $retvalue = "512M" }
}
类似地,你可以使用选择器返回正确的值:
$retvalue = true ? {
$mem < 1024 => "128M",
$mem < 7000 => "160M",
$mem < 15000 => "192M",
$mem < 31000 => "256M",
default => "512M",
}