这个Ruby CASE语句有什么问题?

And*_*rns 2 ruby

我有以下ruby函数,当我称之为"deg_to_dir 270"时,case语句永远不会匹配,当它应该返回W.我一直在拉我的头发而没有将整个事物转换成IF语句我没有下一步.

def deg_to_dir deg
  # used logic from http://www.csgnetwork.com/degrees2direct.html
  d = deg.to_f
  dir = "#{d}°"
  case d
    when d >=  0    && d <=  11.25,
         d > 348.75 && d <= 360
      dir = "N"
    when d >  11.25 && d <=  33.75
      dir = "NNE"
    when d >  33.75 && d <=  56.25
      dir = "NE"

    when d >  56.25 && d <=  78.75
      dir = "ENE"
    when d >  78.75 && d <= 101.25
      dir = "E"
    when d > 101.25 && d <= 123.75
      dir = "ESE"

    when d > 123.75 && d <= 146.25
      dir = "SE"
    when d > 146.25 && d <= 168.75
      dir = "SSE"
    when d > 168.75 && d <= 191.25
      dir = "S"
    when d > 191.25 && d <= 213.75
      dir = "SSW"
    when d > 213.75 && d <= 236.25
      dir = "SW"

    when d > 236.25 && d <= 258.75
      dir = "WSW"
    when d > 258.75 && d <= 281.25
      dir = "W"
    when d > 281.25 && d <= 303.75
      dir = "WNW"
    when d > 303.75 && d <= 326.25
      dir = "NW"
    when d > 326.25 && d <= 348.75
      dir = "NNW"
  end
  dir
end
Run Code Online (Sandbox Code Playgroud)

Kyl*_*ten 7

你要做的是一种if elsif模式.如果您尝试使用case when模式应该使用范围:

case d
when (0..11.25)
  dir = "N"
when (11.25..33.75)
  dir = "NE"
  # etc...
end
Run Code Online (Sandbox Code Playgroud)

每次解析器在执行时都会出现case_statement === when_statement.所有when语句都计算为布尔值,它永远不会等于一个度数.

  • 当你使用case语句时,它自动执行`d ===`在when语句中指定的任何内容.他的所有陈述都评价为布尔,所以它永远不会找到平等. (5认同)