tipos longitud listas lista elemento declarar crear constantes como arreglo array agregar ruby delegates constants

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.