2013-09-24 77 views
2

我只是试图运行一些代码,看起来像这样使用ruby's'case'/'when'方法与||或&&运营商等

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 || false)=> next'。然后它不匹配“epsg”,并且它与下一个......(?)那种有道理 –

+0

@boulder_ruby如果它是这样写的,那么是的 - 但它总是一个真理表达式(作为'anything ||“espg”'是truthy),所以它不应该匹配任何其他分支。 – user2246674

+0

零不是“任何”。什么是什么?红宝石没有对象!除了'对象',当然......呃..... –