longitud - ¿Puedo usar Forwardable para delegar una constante en Ruby?
ruby listas (2)
Forward (y SingleForwardable) le permite agregar funciones de clase a su clase actual a través de un módulo. Cuando escribe un delegador, está especificando qué métodos se están transfiriendo al objeto receptor desde el módulo original.
En su ejemplo, def_single_delegator :@thing, :CONSTANT
se interpreta como lo siguiente: Define un método :CONSTANT
que delega a accessor :@thing
(es decir, llama al método del mismo nombre en el :@thing
acceso).
Como puede ver, esto no está transmitiendo el valor de la constante, sino que está transmitiendo un método con el mismo nombre que la constante. Si desea pasar el mismo valor que la constante, puede proporcionar un método de acceso que le devuelva el valor de la constante original para que pueda asignarlo en esta clase.
Dada una clase como:
class Thing
CONSTANT = 10
# other code
end
Y otro como:
class Other
def initialize
@thing = Thing.new
end
def method
puts CONSTANT
end
end
¿Es posible ampliar Forwardable
para tener el delegado CONSTANT
Other
la constante de Thing
?
He intentado extender SingleForwardable
(vea los documentos aquí ) de esta forma:
class Other
extend SingleForwardable
def initialize
@thing = Thing.new
end
def method
puts CONSTANT
end
def_single_delegator :@thing, :CONSTANT
end
y:
def_single_delegator :@thing, :constant
pero ninguno funcionó, ¿me está equivocando la sintaxis? Si no, ¿hay otra manera?
Éste es respondido por la documentación (énfasis en negrita mío) :
def_single_delegator(accessor, method, new_name=method)
Define un método de método que delega en el descriptor de acceso (es decir, llama al método del mismo nombre en el descriptor de acceso ). Si se proporciona new_name , se usa como el nombre del método delegado.
Entonces, no, solo puedes delegar envíos de mensajes, no búsquedas constantes.