如何在Ruby变量名中使用字符串?

4

我有一个字符串,想将其作为变量名的一部分。具体来说,在Rails路由路径中:

<%= foo_path %>
<%= bar_path %>

我希望路由名称的第一部分是动态的。因此类似以下内容:
@lol = "foo"
<%= [@lol]_path %> # <-- This would really be the "foo_path" variable

Ruby能做到这个吗?
2个回答

10
当然可以:
lol = 'foo'

send "#{lol}_path"
# or
send lol + '_path'

解释: Object#send方法把方法发送给接收者(也就是在接收者上"调用"该方法)。与任何方法调用一样,没有明确的接收者时(例如some_object.send 'foo'),当前上下文会变成接收者,因此调用send :foo等价于self.send :foo。实际上,Rails在幕后经常使用这种技术(例如)。


3
为了教学目的,要想学习这样的东西需要怎样做?只是通过更长时间地接触Ruby就可以了吗? 注:本翻译仅供参考,如有不当之处请谅解。 - Tim
2
经验肯定有帮助,但如果你要使用Ruby,最好阅读尽可能多的核心类文档,特别是ObjectKernel(但实际上它们中没有一个很长)。不要忘记《Ruby程序员修炼之道》,这本开创性的(并且免费)Ruby书籍。 - Jordan Running
我读了那些源代码,但是我不理解它们。当有人解释、教授或展示给我时,这会帮助我更多。或者至少让我能够理解到某个程度。对于初学者来说,存在一些技术上的瓶颈,而这些瓶颈对于经验丰富的程序员来说则变得无形。 - ahnbizcad
我之前评论中的 Pickaxe 链接已经失效了。这是一个有效的链接:http://ruby-doc.com/docs/ProgrammingRuby/ - Jordan Running

2

还有更多内容!

class Person
  attr_accessor :pet
end

class Pet
  def make_noise
     "Woof! Woof!"
  end
end

var_name = "pet"
p = Person.new
p.pet = Pet.new
(p.send "#{var_name}").make_noise

这里所发生的是:
p.send "some_method" 调用 p.some_method,并且使用括号使链接成为可能,即最后调用 p.pet.make_noise。希望我表达清楚了。


我认为更符合惯用语法的写法是 p.send(var_name).make_noise - Jordan Running

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