It's easy to 'nil guard' for normal variable.
def user
@user ||= User.find(1)
end
but it's not simple for generated variable name.
def user(id)
valname = "@user_#{id}"
instance_variable_set(valname, User.find(id)) unless instance_variable_defined?(valname)
instance_variable_get(valname)
end
I want to write it like this.
def user(id)
instance_variable_get_or_set("@user_#{id}") { User.find(1) }
end
it can be implemented by this code.
def instance_variable_get_or_set(valname, &block)
instance_variable_set(valname, block.call) unless instance_variable_defined?(valname)
instance_variable_get(valname)
end