And*_*ack 55
如果您可以在变量名前面原谅@符号,则以下内容将起作用:
variable_name = ... # determine user-given variable name
instance_variable_set("@#{variable_name}", :something)
Run Code Online (Sandbox Code Playgroud)
这将创建一个名为的变量@whatever,其值设置为:something.的:something,清楚的,可能是你想要的任何东西.这看起来在全局范围内起作用,通过声明一个自发的Object实例来绑定一切(我找不到这个的参考).
该instance_variable_get方法将允许您以相同的方式按名称检索值.
instance_variable_get("@#{variable_name}")
Run Code Online (Sandbox Code Playgroud)
Tim*_*van 12
而不是直接这样做,为什么不考虑使用哈希.字符串将是键,您要存储的值将是值.像这样的东西:
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
Run Code Online (Sandbox Code Playgroud)
这有几个好处.首先,这意味着你没有做任何可能后来难以弄清楚的魔法.其次,你正在使用一个非常常见的Ruby习惯用法,它在整个Rails中用于类似的功能.
如果eval()你已经首先声明了你的变量,你可以使用它:
>> foo = []
>> eval("foo")[1] = "bar"
>> foo[1]
=> "bar"
Run Code Online (Sandbox Code Playgroud)
这是文档.
现在只需使用 instance_variable_set 方法,您就可以在运行时创建实例变量。
instance_variable_set('@' + 'users', User.all)
Run Code Online (Sandbox Code Playgroud)
我并不是说要消极,而是谨慎行事.Ruby为高度动态的编程提供了许多功能,例如define_method,将块存储为Proc稍后要调用的对象等.通常这些代码更清晰,更安全.99%的使用时间eval()都是错误的.
绝对不要eval()在包含用户提交的输入的字符串上使用.
| 归档时间: |
|
| 查看次数: |
41366 次 |
| 最近记录: |