2013-09-24 5 views
2

Я просто попытался запустить код, который выглядел как этотИспользование рубинового «случая»/«когда» с использованием || или && операторы и т.д.

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" в скобках не работает, либо

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

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

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

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

Благодаря

ответ

1

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

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

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

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

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

Или использовать другую форму, напоминающую If- еще:

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

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


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

if type.nil? || type == "espg" 
+0

ahh 'x == nil || «epsg» '** ** совпадает с nil **, но **, так как линия продолжает оценивать, он должен перейти от этого соответствия из-за характера || оператор i.e. (nil || false) => next'. gotcha, а затем он не соответствует «epsg», а его последующему ... (?), что имеет смысл –

+0

@boulder_ruby Если это так написано, тогда да - но это всегда будет правдой выражение (поскольку 'any ||" espg "' является правдивым), поэтому он никогда не должен соответствовать альтернативной ветви. – user2246674

+0

nil не 'ничего'. что-нибудь? У рубина нет объекта для этого !!! кроме 'Object', конечно ... erm ..... –