Мне нужно написать случай, используя несколько диапазонов, чтобы лучше написать что-то вроде следующего кода спагетти:
if $mem < 1024 { $retvalue = "128M" }
elsif $mem < 7000 { $retvalue = "160M" }
elsif $mem < 15000 { $retvalue = "192M" }
elsif $mem < 31000 { $retvalue = "256M" }
else { $retvalue = "512M" }
Можно ли использовать операторы case, используя функцию диапазона (на stdlib) или что-то лучше?
BR
Джузеппе
Куклы 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",
}
Для диапазонов такой величины я бы посоветовал воздержаться от создания диапазонов (т.е. массивов, заполненных целыми значениями для сканирования).
Ваш подход твердый. Если вам действительно нужен оператор case, вы можете взять кусок кода Ruby и inline_template
функция, но это снижает производительность и не добавляет много с точки зрения ремонтопригодности.