tipos manejo interpolar datos contar concatener caracteres cadenas ruby string

ruby - manejo - Usar una cadena como variable en tiempo de ejecución



tipos de datos en ruby (6)

Tengo una cadena, que se ha creado en tiempo de ejecución. Quiero usar esta cadena como una variable para almacenar algunos datos en ella. ¿Cómo puedo convertir la cadena en un nombre de variable?


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)


Como dice Jason Watkins, muchas personas pueden usar rápidamente eval () a primera vista 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 son recuperables. Cualquier cosa con el prefijo @ o @@ se recupera fácilmente.


En lugar de hacerlo directamente, ¿por qué no considerar usar 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 beneficios. 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 una expresión idiomática de Ruby muy común que se usa para funciones similares en todo Rails.


No pretendo 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 para llamar 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.


Puede usar eval() para esto siempre que haya declarado su variable primero:

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

Aquí están los docs .


Si puede perdonar un signo @ delante del nombre de la variable, lo siguiente funcionará:

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

Esto creará una variable llamada @whatever , con su valor establecido en :something . El :something , claramente, podría ser lo que quieras. Esto parece funcionar en un ámbito global al declarar una instancia de Object espontánea 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}")