【问题标题】:Is there a way to initialize hash's values lazily?有没有办法懒惰地初始化哈希值?
【发布时间】:2013-02-11 16:13:37
【问题描述】:

我有一个像这样的哈希:

h = {
  a: '/users/sign_up',
  b: "/user/#{@user.id]}"
}

稍后我会做h[:b]

哈希值在哈希本身初始化时被初始化。但我希望每次调用h[:b] 时都调用@user.id

似乎不可能用 Ruby 的哈希来做到这一点。但是有一些解决方法吗?

【问题讨论】:

    标签: ruby hash lazy-evaluation


    【解决方案1】:

    您可以将 lambdas 用于哈希值,并在需要实际值时调用 lambda,例如:

    h = {
      a: ->{'/users/sign_up'},
      b: ->{"/user/#{@user.id}"}
    }
    
    h[:b].call
    

    【讨论】:

      【解决方案2】:
      h = {}
      h.default_proc = proc do |hash, key|
        key == :b ? "/user/#{@user.id}" : nil
      end
      h[:a] #=> nil
      h[:b] #=> "/user/<id>"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-04
        • 2021-06-15
        • 2016-11-10
        • 2020-11-25
        • 1970-01-01
        • 1970-01-01
        • 2022-12-25
        • 2018-12-12
        相关资源
        最近更新 更多