【问题标题】:How do I return a hash with a case statement?如何返回带有 case 语句的哈希?
【发布时间】:2013-03-29 18:53:55
【问题描述】:

我正在尝试编写一个获取日期的天数的函数,例如,今天(3 月 29 日)是一年中的第 88 天。然后它返回一个包含月份和日期的哈希:

{"month" => "March, "day" => 29}

我不太清楚这段代码有什么问题,但它总是返回nil。有什么想法吗?我正在使用 Ruby 1.8.7 p358。

def number_to_date(days)
  date = case days
    when days <= 31  then {"month" => "January",   "day" => days}
    when days <= 59  then {"month" => "February",  "day" => (days - 31)}
    when days <= 90  then {"month" => "March",     "day" => (days - 59)}
    when days <= 120 then {"month" => "April",     "day" => (days - 90)}
    when days <= 151 then {"month" => "May",       "day" => (days - 120)}
    when days <= 181 then {"month" => "June",      "day" => (days - 151)}
    when days <= 212 then {"month" => "July",      "day" => (days - 181)}
    when days <= 243 then {"month" => "August",    "day" => (days - 212)}
    when days <= 273 then {"month" => "September", "day" => (days - 243)}
    when days <= 304 then {"month" => "October",   "day" => (days - 273)}
    when days <= 334 then {"month" => "November",  "day" => (days - 304)}
    when days <= 365 then {"month" => "December",  "day" => (days - 334)}
  end
  return date
end

【问题讨论】:

    标签: ruby hashmap


    【解决方案1】:

    如果要在每个 when 子句中使用表达式,则需要使用纯 case 语句。否则,Ruby 将调用(days &lt;= 31) === days,这永远不会是真的。

    def number_to_date(days)
      date = case
        when days <= 31  then {"month" => "January",   "day" => days}
        when days <= 59  then {"month" => "February",  "day" => (days - 31)}
        # ...
      end
      return date
    end
    

    然而,这个实现忽略了闰日,这样做似乎更简单、更正确:

    def number_to_date(days)
      date = Date.ordinal(Date.today.year, days)
      {"month" => Date::MONTHNAMES[date.month], "day" => date.day}
    end
    

    【讨论】:

    • Rein 的实现很好,所以请随意忽略我的回答 :)
    【解决方案2】:

    您只需要稍微调整一下语法。从date = case days 语句中删除days。否则,您的条件语句将与 days 变量进行比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 2021-10-10
      • 2017-10-23
      • 1970-01-01
      相关资源
      最近更新 更多