Использование метода 'case'/'when' в ruby ​​с || или && операторы и т. д.

Я просто попытался запустить какой-то код, который был похож на это

def get_proj4(srid, type=nil)
  type.downcase! if type
  case type
  when nil || "epsg"
   open("http://spatialreference.org/ref/epsg/#{srid}/proj4/").read
  when "esri"
   open("http://spatialreference.org/ref/esri/#{srid}/proj4/").read
  end
end

и он не работал должным образом, возвращая ноль каждый раз. обертывание nil || "epsg" в скобках тоже не сработало

Оказывается, рубин не позволил бы мне использовать || оператор в этом

Теперь я предполагаю, что ruby ​​берет метод case/when и в конечном итоге разбивает его на группу условных выражений, выглядящих примерно так:

x = type
  if x == (nil || "epsg")
    y = ...runs code...
  elsif x == "esri"
    y = ...
  end
x = nil
y

но, очевидно, это не так. Что тут происходит?

Спасибо

1 ответ

Выражение вычисляется первым, поэтому when nil || "espg" эквивалентно when "espg"1 - это никогда не будет совпадать nil,

Чтобы сопоставить "или", разделите параметры запятой:

case type
when nil, "espg" ..
when "esri" ..

Или, альтернативно, возможно, нормализовать значение:

case (type || "espg")
when "espg" ..
when "esri" ..

Или используйте другую форму, похожую на if-else:

case
when type.nil? || type == "espg" ..
when type == "esri" ..

Или какая-то комбинация всего:)


1 Это также та же самая причина, почему пример if Подозреваемый Вероятно, это должно быть написано так:

if type.nil? || type == "espg"
Другие вопросы по тегам