【发布时间】: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
我有一个像这样的哈希:
h = {
a: '/users/sign_up',
b: "/user/#{@user.id]}"
}
稍后我会做h[:b]。
哈希值在哈希本身初始化时被初始化。但我希望每次调用h[:b] 时都调用@user.id。
似乎不可能用 Ruby 的哈希来做到这一点。但是有一些解决方法吗?
【问题讨论】:
标签: ruby hash lazy-evaluation
您可以将 lambdas 用于哈希值,并在需要实际值时调用 lambda,例如:
h = {
a: ->{'/users/sign_up'},
b: ->{"/user/#{@user.id}"}
}
h[:b].call
【讨论】:
h = {}
h.default_proc = proc do |hash, key|
key == :b ? "/user/#{@user.id}" : nil
end
h[:a] #=> nil
h[:b] #=> "/user/<id>"
【讨论】: