2013-09-24 37 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

零不是「任何」。什麼是什麼?紅寶石沒有對象!除了'對象',當然......呃..... –