如何在Ruby中使用#{...}构造?

时间:2012-03-06 12:28:06

标签: ruby

我不明白在Ruby中如何使用#{...}构造。

我在http://www.ruby-doc.org/core-1.9.3/Regexp.html

的正则表达式示例中使用过
place = "tokyo"
/#{place}/.match("Go to tokyo")
    #=> #<MatchData "tokyo">

这个#{...}功能究竟到底是什么,并且有人知道一些好的工作示例。

非常感谢帮助。

谢谢!

3 个答案:

答案 0 :(得分:6)

这是一个更简单的例子:

place = "Tokyo"
puts "Go to #{place}"

#{...}构造的作用是执行它包含的ruby代码,并返回结果的字符串表示,然后将其嵌入到构造出现的字符串中。

另一个例子:

place = "Tokyo"
puts "#{place} is a #{place.class} of #{place.length} characters"

换句话说,您的示例等同于:

/tokyo/.match("Go to tokyo")

希望这有帮助。

答案 1 :(得分:3)

被称为插值,并允许您将占位符转换为它们所代表的值...

http://kconrails.com/2010/12/08/ruby-string-interpolation/

答案 2 :(得分:1)

#{...}特别有用,在元编程中使用了很多。它可以帮助您动态调度方法,而无需在运行时知道这些方法的名称。

if conf.rc and File.exists?( conf.rc )
  YAML.load_file(conf.rc).each do |k,v|
    conf.send("#{k}=" , v)
  end
end

如您所见,直到运行时我们不知道将要分派哪些方法。通过.send#{...},我们可以动态调度方法。例如,在上面的代码中,取决于conf.rc中的值,可以调度不同的方法。

示例取自Metaprogramming Ruby