Pregunta

Así que el método a continuación en forma dinámica class_eval crea descriptores de acceso para los atributos definidos en tiempo de ejecución. Se puede utilizar, por ejemplo, para crear objetos de configuración con los atributos leídos desde un archivo de configuración (y desconocido hasta tiempo de ejecución). Me entender todos de la misma a excepción de la rama más. Si estoy en lo correcto la rama else devuelve el valor del atributo (val [0]) si hay un valor pasado * val. Sin embargo, la forma en que su escrito yo esperaría que devolver una matriz (val) si hay más de un valor pasado * var. En particular, si tengo algo como lo siguiente:

value = 5

A continuación, a partir de la lectura del código que se puede esperar @value to be [=,5]. Sin embargo los rendimientos @value 5 y no la matriz [=, 5]. ¿Cómo es esto posible?

class Module
    def dsl_accessor(*symbols)
        symbols.each do |sym|
            class_eval %{
                def #{sym}(*val)
                    if val.empty?
                        @#{sym}
                    else
                         @#{sym} = val.size == 1 ? val[0] : val
                    end
                end
            }
        end
    end
end
¿Fue útil?

Solución

El signo igual no es un argumento para el método, que es una parte del nombre del método. En realidad se puede llamar a la asignación de esta manera:

value=(5)

Así que sólo números enteros 5 es un argumento para la función

* Actualización

class Module
    def dsl_accessor(*symbols)
        symbols.each do |sym|
            class_eval %{
                def #{sym}
                  @#{sym}
                end
                def #{sym}=(val)
                  @#{sym} = val
                end
            }
        end
    end
end
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top