Ruby:将变量合并到字符串中


95

我正在寻找一种在Ruby中将变量合并为字符串的更好方法。

例如,如果字符串类似于:

“的animal actionsecond_animal

而且我有animalaction和的变量,second_animal将这些变量放入字符串的首选方式是什么?

Answers:


240

惯用的方式是写这样的东西:

"The #{animal} #{action} the #{second_animal}"

注意字符串周围的双引号(“):这是Ruby使用其内置占位符替换的触发器。您不能将它们替换为单引号('),否则字符串将保持原样。


2
抱歉,也许我简化了太多问题。字符串将从数据库中提取,并且变量取决于许多因素。通常我会用一个或两个变量代替,但这有可能会更多。有什么想法吗?
FearMediocrity

#{}构造可能是最快的(尽管这对我来说似乎还是违反直觉的)。除了gix的建议之外,您还可以使用+或<<来组装字符串,但是可能会创建一些中间字符串,这很昂贵。
迈克·伍德豪斯

插值变量的最佳方法
Dragutescu Alexandru

115

您可以使用类似sprintf的格式将值注入到字符串中。为此,字符串必须包含占位符。将您的参数放入数组中并使用以下方式:(有关更多信息,请参见Kernel :: sprintf的文档。)

fmt = 'The %s %s the %s'
res = fmt % [animal, action, other_animal]  # using %-operator
res = sprintf(fmt, animal, action, other_animal)  # call Kernel.sprintf

您甚至可以显式指定参数编号并将其随机排列:

'The %3$s %2$s the %1$s' % ['cat', 'eats', 'mouse']

或者使用哈希键指定参数:

'The %{animal} %{action} the %{second_animal}' %
  { :animal => 'cat', :action=> 'eats', :second_animal => 'mouse'}

请注意,必须为%运算符的所有参数提供一个值。例如,您不可避免地要定义animal


18

#{}如其他答案所述,我将使用构造函数。我还想指出,这里有个细微的地方要提防:

2.0.0p247 :001 > first_name = 'jim'
 => "jim" 
2.0.0p247 :002 > second_name = 'bob'
 => "bob" 
2.0.0p247 :003 > full_name = '#{first_name} #{second_name}'
 => "\#{first_name} \#{second_name}" # not what we expected, expected "jim bob"
2.0.0p247 :004 > full_name = "#{first_name} #{second_name}"
 => "jim bob" #correct, what we expected

虽然可以使用单引号创建字符串(如first_namelast_name变量所示,#{}构造函数只能用于带双引号的字符串中。



10

这称为字符串插值,您可以像这样进行操作:

"The #{animal} #{action} the #{second_animal}"

重要提示:仅当字符串在双引号(“”)内时,它才起作用。

无法按预期工作的代码示例:

'The #{animal} #{action} the #{second_animal}'

感谢您使用适当的术语,以便新程序员可以学习:插值。
Mike Bethany

3

标准ERB模板系统可能适用于您的方案。

def merge_into_string(animal, second_animal, action)
  template = 'The <%=animal%> <%=action%> the <%=second_animal%>'
  ERB.new(template).result(binding)
end

merge_into_string('tiger', 'deer', 'eats')
=> "The tiger eats the deer"

merge_into_string('bird', 'worm', 'finds')
=> "The bird finds the worm"

0

您可以将其与局部变量一起使用,如下所示:

@animal = "Dog"
@action = "licks"
@second_animal = "Bird"

"The #{@animal} #{@action} the #{@second_animal}"

输出会道:“

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.