【问题标题】:Using ruby's 'case'/'when' method with || or && operators, etc使用 ruby​​ 的 'case'/'when' 方法和 ||或 && 运算符等
【发布时间】:2013-09-24 00:24:24
【问题描述】:

我只是尝试运行一些看起来像这样的代码

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。将 nil || "epsg" 括在括号中也不起作用

原来 ruby​​ 不允许我在此使用 || 运算符

现在我假设 ruby​​ 采用 case/when 方法并最终将其分解为一组看起来像这样的条件

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

但显然不是。这是怎么回事?

谢谢

【问题讨论】:

    标签: ruby conditional case or-operator andand


    【解决方案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"
    

    【讨论】:

    • ahh x == nil || "epsg" 确实匹配 nil 但是,由于该行继续评估,它必须从该匹配继续前进,因为|| 的性质运算符,即(nil || false) => next。明白了,然后它与“epsg”不匹配,然后转到下一个...(?)那种有道理
    • @boulder_ruby 如果它是这样写的,那么是的 - 但它始终是一个真实的表达式(因为anything || "espg" 是真实的)所以它永远不应该匹配任何替代分支。
    • nil 不是anything。有什么? ruby 没有一个对象!除了Object,当然……呃……
    • 但是不要尝试匹配 nil,知道了。这就是(?)的 false
    • @boulder_ruby 我的意思是anything 的意思是x == nil 表达式的计算结果并不重要——如果它的计算结果是一个真实的值,但如果它的计算结果是假值(即假)然后“espg”(真值)将产生。 a || b 是短路的,并且如果表达式 a b 的计算结果为真值,则将始终计算为真值;否则会导致 false。
    猜你喜欢
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 2011-01-16
    • 2014-12-22
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多