Использование метода '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"