2010-03-27 121 views
18

我刚刚开始学习Ruby,并且编写了一个程序来生成一些数字并将它们分配给变量@one,@two,@three等。然后用户可以通过输入它的名字来指定一个变量(例如一个)。然后我需要做一些像'@ [valueofinout] = asd'。我该如何做到这一点,有没有更好的方式,因为我想到的方式似乎很沮丧?我发现在Ruby中使用变量的值作为另一个变量名

x = "myvar" 
myvar = "hi" 
eval(x) -> "hi" 

,但我不完全理解为什么需要第二行。在我来说,我会使用类似可以通过此方法来检索

@one = "21" 
input = "one" 
input = "@" + input 
changeto = "22" 
eval(input) -> changeto 

回答

28

使用instance_variable_setrubydoc

instance_variable_set("@" + varname, value) 

在大多数情况下,虽然,你应该从你的用户与之交互变量分开你的正常的Ruby变量。如何创建一个用户变量散列,例如

@uservars = { 'one' => 1, 'two' => 2 } 
two = @uservars['two'] # Look up 'two' variable 

varname = "myvar" 
@uservars[varname] = 5 # Set a variable by name 
value = @uservars[varname] # Get a variable by name 
+1

哇,这实际上是PHP在语法清洁方面胜过Ruby的一个领域。 http://stackoverflow.com/a/4169891/2951835 – ahnbizcad 2015-05-09 07:06:18

+0

Ruby很难做,因为它很丑,除非是元编程,否则很少需要设置实例的用户指定变量。动态地混淆全局变量是一个安全漏洞;如果你想要一组用户定义的变量,那么你可能需要一个散列。 – rjh 2016-11-16 17:30:21

2

实例变量:

input = instance_variable_get("@one") 

在此之后,你的情况,你必须input等于“21”。

+0

嗨,我不太清楚这是否会为我需要的工作。我需要有一些东西,将一个变量分配一定的数字(比如变量A),但变量A的名字是未知的。变量A的名称存储在变量B中,但我需要使用变量B的值将变量A赋值给变量A. AFAICT这不能通过instance_variable_get来完成。 – hrickards 2010-03-27 17:16:41

+0

@hrickards:你知道A的可能值吗?如果你这样做有另一种方式。但intance_variable_get应该做你想做的! – 2010-03-27 17:20:11

+0

@Niklaos 1和49之间的整数 – hrickards 2010-03-27 17:23:44

相关问题