2009-05-19 11 views

Respuesta

6

Se puede utilizar para este eval() a condición de que se ha declarado en su primera variable:

>> foo = [] 
>> eval("foo")[1] = "bar" 
>> foo[1] 
=> "bar" 

Aquí está la docs.

5

No me refiero a ser negativo, pero andar con cuidado. Ruby le ofrece muchas funciones para la programación altamente dinámica como define_method, almacenando bloques como objetos Proc que se llamarán más tarde, etc. Generalmente estos son códigos más limpios y mucho más seguros. El 99% del tiempo usando eval() es un error.

Y nunca use eval() en una cadena que contenga entradas enviadas por el usuario.

53

Si se puede perdonar un signo @ delante del nombre de la variable, el siguiente trabajo:

variable_name = ... # determine user-given variable name 
instance_variable_set("@#{variable_name}", :something) 

Esto creará una variable llamada @whatever, con su valor ajustado a :something. El :something, claramente, podría ser lo que quieras. Esto parece funcionar en el ámbito global, al declarar una instancia espontánea Object que vincula todo (no puedo encontrar una referencia para esto).

El método instance_variable_get le permitirá recuperar un valor por nombre de la misma manera.

instance_variable_get("@#{variable_name}") 
+0

¿Por qué '' # {variable_name} =: something' work? –

+0

Obtengo 'no está permitido como nombre de variable de instancia' para' instance_variable_set'. Rails 3.0.7. –

+0

¡Esto es brillante! –

0

Como dice Jason Watkins, mucha gente podría ser rápido de usar eval() Lo primero y esto sería un grave error. La mayoría de las veces puede utilizar la técnica descrita por Tack si ha tenido cuidado de usar una variable de instancia de clase en lugar de una local.

Las variables locales generalmente no se pueden recuperar. Cualquier cosa con el prefijo @ o @@ se recupera fácilmente.

10

En lugar de hacerlo directamente, ¿por qué no considerar el uso de un hash en su lugar. La cadena sería la clave, y el valor que desea almacenar sería el valor. Algo como esto:

string_values = { } 
some_string = params[:some_string]  # parameter was, say "Hello" 
string_values[some_string] = 42 
string_values       # { 'Hello' => 42 } 
some_number = string_values[some_string] 
some_number        # 42 

Esto tiene un par de ventajas. En primer lugar, significa que no estás haciendo nada mágico que pueda ser difícil de entender más adelante. En segundo lugar, está utilizando un lenguaje Ruby muy común que se usa para funciones similares en todo Rails.

+0

mi pensamiento exactamente :) –

+0

¿Eh? ¿Qué sucede si solo desea almacenar "Hola" como una variable para usar más adelante? ¿Dónde entra el 42? Esto parece demasiado complejo ...aunque reconozco que soy un Ruby newb. – Southerneer

+0

Eso no es lo que pregunta el interlocutor. Están recibiendo un valor de cadena desde algún lugar en * runtime *, y desean asociar esa cadena con un valor. Claro, podría hackear el sistema para crear una variable con ese nombre de cadena (con la advertencia relacionada de verificar la cadena para asegurarse de que sea un identificador válido), pero lo que sugiero es que use el sencillo, ampliamente comprendido y seguro ' Hash' para asociar la cadena y el valor juntos. –

2

Ahora, simplemente usando el método instance_variable_set, puede crear una variable de instancia en tiempo de ejecución.

instance_variable_set('@' + 'users', User.all) 
Cuestiones relacionadas