为什么没有方法可以在编程语言中为变量赋值

时间:2018-03-06 18:00:17

标签: ruby-on-rails ruby

为什么有方法为变量赋值

我有时想动态地为变量赋值。

例如,当我写这些时,

taro = Student.new "taro"
ziro = Student.new "ziro"
tarao = Student.new "tarao"

我真的想写这些。

["taro", "ziro", "tarao"].each do |name|
 varname = Student.new name  
end

为什么会出现这样的方法?

asign(varname, value, scope)

为什么我不能这样编码?

["taro", "ziro", "tarao"].each do |name|
  asign(name, Student.new name, GLOBAL)
end

这不是关于如何动态分配的问题,但是 一个问题'为什么'是不是有任何架构来解决这个问题。

我想知道原因。谁能解释一下?

1 个答案:

答案 0 :(得分:0)

编写代码时,但尤其在使用像Ruby这样的动态语言时,请考虑数据结构而不是变量。

你正在寻找的是:

students = [ "taro", "ziro", "tarao" ].map do |name|
  Student.new(name)
end

在那里创造了一系列学生。这些可以引用为students[0],依此类推。

如果您希望按名称编制索引:

students = [ "taro", "ziro", "tarao" ].map do |name|
  [ name, Student.new(name) ]
end.to_h

然后你可以致电students['taro']并获得该学生。您经常会发现,最小的Ruby解决方案通常是最类似Ruby的。

使用这样的常规数据结构有助于您将此数据从代码中的一个位置传递到另一个位置。考虑这是多么容易:

best_student(students)

这种方法:

best_student(taro, ziro, tarao, ...)

每次添加新学生时,您需要更改所有代码。这会适得其反。

与你想要的大致相同的版本相比之下真的很难看,而且故意这样,你不应该随便这么做,这应该不容易:

[ "taro", "ziro", "tarao" ].map do |name|
  instance_variable_set(:"@#{name}", Student.new(name))
end

在那里创建像@taro这样的实例变量,但与简单版本相比也是一个巨大的混乱。