【问题标题】:one line hash creation in ruby在 ruby​​ 中创建一行哈希
【发布时间】:2009-06-07 18:59:08
【问题描述】:

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

我有一个@date(即 = Date.today),然后是几天......比如说 5

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

我知道肯定缺少一些超级简单的东西。

谢谢...

【问题讨论】:

  • 你需要哈希做什么?密码学?快速索引?重复检测?
  • 您的代码没有意义。您将相同的哈希键分配给五个不同的值。你到底想做什么?
  • 看起来你试图在一行中做太多事情。

标签: ruby-on-rails ruby arrays hash


【解决方案1】:

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 免费获得这些数字键,作为奖励,值的顺序被保留。在我看来,使用Ranges 开头稍微阐明了意图,但这并不是一个惊人的区别。

【讨论】:

    【解决方案2】:

    这似乎有效...

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

    【讨论】:

      【解决方案3】:

      您想要一个包含今天日期和哈希键的哈希?

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

      这样做的好处是不限于几天。它适用于任何键。此外,每个键仅根据需要进行一次计算。

      【讨论】:

        【解决方案4】:

        您可以使用collect 在一行中创建一个数组,但我不确定您的哈希值来自何处...

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

        【讨论】:

          猜你喜欢
          • 2012-07-19
          • 1970-01-01
          • 2012-11-23
          • 2014-12-06
          • 1970-01-01
          • 2021-02-03
          • 2010-09-07
          • 2016-01-27
          • 1970-01-01
          相关资源
          最近更新 更多