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?Usar una cadena como variable en tiempo de ejecución
Respuesta
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.
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.
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}")
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.
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.
mi pensamiento exactamente :) –
¿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
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. –
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)
- 1. ¿Cómo usar una cadena como nombre de variable en C++?
- 2. Usando una variable de cadena como nombre de variable
- 3. ¿Convertir variable a tipo solo conocido en tiempo de ejecución?
- 4. variable de conjunto SSIS en tiempo de ejecución
- 5. Tiempo de ejecución variable de un programa en C
- 6. D tiempo de ejecución como DLL
- 7. Nombre de la variable como una cadena en Javascript
- 8. Cómo usar una variable como modificador en una sustitución
- 9. cadena de conexión en tiempo de ejecución de Entity Framework
- 10. Cuándo usar una variable variable en PHP?
- 11. DebuggerDisplay resolver en cadena en tiempo de ejecución
- 12. cómo pasar una referencia variable literal ($ {foo}) como argumento de programa en una configuración de ejecución
- 13. EF 5 Cambiar cadena de conexión en tiempo de ejecución
- 14. ¿Cómo usar una variable como atributo de objeto en rieles?
- 15. Generar, compilar y usar código Java en tiempo de ejecución?
- 16. Usando cadena como nombre de variable
- 17. ¿Es posible usar condicionalmente XPManifest en tiempo de ejecución?
- 18. Fortran: ajuste tipo/precisión de una variable en tiempo de ejecución
- 19. redirección subproceso a una variable como una cadena
- 20. ¿Una variable que es de solo lectura después de la asignación en tiempo de ejecución?
- 21. Ninject Rebind en el tiempo de ejecución, ¿se puede usar como característica alternar?
- 22. Pegue una cadena como una variable, no como un fragmento de código ejecutable, en IPython
- 23. Tiempo de impresión de MATLAB como una cadena
- 24. ¿Cómo usar una variable de PowerShell como parámetro de comando?
- 25. recuperando el nombre de una variable en python en tiempo de ejecución?
- 26. ¿Cómo usar layoutinflator para agregar vistas en tiempo de ejecución?
- 27. Ignorar algunas propiedades en tiempo de ejecución al usar DataContractSerializer
- 28. ¿Es posible declarar una variable en C, cuyo nombre da el usuario en tiempo de ejecución?
- 29. ¿Cómo puedo rastrear una variable en tiempo de ejecución en C#?
- 30. ¿Cómo puedo usar una variable de JavaScript como una variable de PHP?
¿Por qué '' # {variable_name} =: something' work? –
Obtengo 'no está permitido como nombre de variable de instancia' para' instance_variable_set'. Rails 3.0.7. –
¡Esto es brillante! –