ruby中的一行哈希创建

时间:2009-06-07 18:59:08

标签: ruby-on-rails ruby arrays hash

我怎样才能使用像“times”这样的简单东西在ruby中构造一个哈希

我有一个@date(即= Date.today)然后好几天...说5

5.times { |i| @date_range[:day] = (@date+i).strftime("%Y-%m-%d") }

我知道必须有一些超级简单的东西。

...谢谢

4 个答案:

答案 0 :(得分:7)

Date个对象也是Comparable,因此您可以构建Range

@range = @date..(@date + 10)

您可以轻松地迭代它并输出结果。如果您想以数字方式访问特定日期,可以执行以下操作:

@date_range = (@date..(@date + 10)).to_a
@date_range[1]

或者,如果您确实需要事先格式化日期,请参见示例:

@date_range = (@date..(@date + 10)).map { |date| date.strftime("%Y-%m-%d") }
@date_range[1]

最后一行与您的@date_range[1](相当于明天/ @date + 1)相当,即使它实际上是Array而不是Hash。带有连续数字键的Hash没有多大意义:您使用Array 免费获得这些,作为奖励,值的顺序是保存。在我看来,使用Range s开始略微澄清意图,但这并不是一个惊人的差异。

答案 1 :(得分:1)

这似乎有用......

(1..10).each { |i| @date_range[i] = (@date+i).strftime("%Y-%m-%d") }

答案 2 :(得分:1)

您想要一个包含今天日期加上哈希键的哈希值吗?

today = Date.today
days = Hash.new { |h,k| h[k] = (today + k).strftime( '%Y-%m-%d' ) }

这具有不限于几天的优点。它适用于任何键。另外,每个键只需要计算一次,并根据需要进行计算。

答案 3 :(得分:0)

你可以使用collect在一行中创建一个数组,但我不确定你的哈希在哪里......

@date_range = 5.times.collect { |i| (@date+i).strftime("%Y-%m-%d") }