Si recibe un hash como único argumento, ¿por qué no mantenerlo como una variable de instancia? Siempre que necesite un valor, llámelo desde el hash. Puede mantener corto el nombre de la variable de instancia para que pueda ser llamado fácilmente.
class Foo
attr_reader :p
def initalize p
@p = p
end
def foo
do_something_with(@p[:name])
...
end
end
Si @p[:name]
sigue siendo demasiado largo para usted, entonces usted puede ahorrar un proc como una variable de instancia, y llame a la magnitud de salida como @p.(:name)
.
class Foo
attr_reader :p
def initialize p
@p = ->x{p[x]}
end
def foo
do_something_with(@p.(:name))
...
end
end
O, una forma alternativa es definir un método que llame al hash y aplique la clave.
class Foo
def initalize p
@p = p
end
def get key
@p[key]
end
def foo
do_something_with(get(:name))
...
end
end
Si desea establecer los valores, se puede definir un método de selección y comprobación adicional para las claves no válidas si lo desea.
class Foo
Keys = [:name, :age, :email, :gender, :height]
def initalize p
raise "Invalid key in argument" unless (p.keys - Keys).empty?
@p = p
end
def set key, value
raise "Invalid key" unless Keys.key?(key)
@p[key] = value
end
def get key
@p[key]
end
def foo
do_something_with(get(:name))
...
end
end
De hecho, creo que la respuesta a esta pregunta es 'no' - podría haber mejores formas, pero si hubiera una manera mejor y más idiomática, habría una respuesta inequívocamente votada a continuación. –