在Ruby中将变量的值作为另一个变量的名称使用

21
我刚开始学习Ruby,编写了一个生成数字并将它们分配给变量@one、@two、@three等的程序。用户可以通过输入变量名称(如one)来指定要更改的变量。然后我需要做类似'@[valueofinout] = asd'这样的事情。我该如何做,是否有更好的方法,因为我想到的方式似乎不鼓励使用? 我已经找到了一些资料。
x = "myvar"
myvar = "hi"
eval(x) -> "hi"

但我并不完全理解为什么需要第二行。在我的情况下,我是否应该使用类似于

@one = "21"
input = "one"
input = "@" + input
changeto = "22"
eval(input) -> changeto
2个回答

34

使用instance_variable_set (rubydoc)


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 的一个领域。https://dev59.com/SW855IYBdhLWcg3wvXHd#4169891 - ahnbizcad
Ruby很难做到这一点,因为它很丑陋,除非你在元编程时需要设置实例的用户指定变量,否则很少需要这样做。动态地操纵全局变量是一个安全漏洞;如果你想要一组用户定义的变量,那么你可能需要一个哈希表。 - rjh

2

通过这个方法可以获取实例变量:

input = instance_variable_get("@one")

在这之后,你的情况下,input 将等于 "21"。

嗨,我不确定那个方案是否适合我的需求。 我需要有一些东西可以将某个数字分配给一个变量(比如变量A),但是变量A的名称是未知的。 变量A的名称存储在变量B中,因此我需要使用变量B的值来分配某个内容给变量A。据我所知,这无法使用instance_variable_get实现。 - hrickards
@hrickards:你知道A可能的值吗?如果你知道,还有另一种方法。但是instance_variable_get应该可以满足你的需求! - Nicolas Guillaume
@Niklaos 一个介于1到49之间(包括1和49)的整数。 - hrickards
变量A只有六个可能的名称,因此可以使用if else语句来检查它们,但我认为应该有更简洁的方法。难道没有吗? - hrickards

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接