2013-02-11 3 views
0

У меня есть хэш, как:Есть ли способ инициализировать значения хэша лениво?

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

Позже я h[:b].

Значения хэш инициализируются при инициализации самого хэша. Но я бы хотел, чтобы @user.id вызывался каждый раз, когда вызывается h[:b].

Кажется, это невозможно сделать с помощью хэша Ruby. Но есть ли способ обхода?

ответ

3

Вы можете использовать лямбды для значений хэша, и называют лямбда, когда требуется действительное значение, например .:

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>" 
Смежные вопросы