Назад | Перейти на главную страницу

Операторы случая марионетки с целым диапазоном



Мне нужно написать случай, используя несколько диапазонов, чтобы лучше написать что-то вроде следующего кода спагетти:

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 функция, но это снижает производительность и не добавляет много с точки зрения ремонтопригодности.