有没有办法懒惰地初始化哈希的值?

时间:2013-02-11 16:13:37

标签: ruby hash lazy-evaluation

我有一个哈希:

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

稍后我做h[:b]

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

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

2 个答案:

答案 0 :(得分:3)

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

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

h[:b].call

答案 1 :(得分:2)

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