Ruby中相当于Python的`s= "hello, %s. Where is %s?" % ("John","Mary")`的语法是什么?

155

在Python中,这种字符串格式化的习惯用法非常普遍

s = "hello, %s. Where is %s?" % ("John","Mary")

在 Ruby 中等价的是什么?


3
没有字符串拼接,只有字符串格式化。而且谷歌的回答速度比 Stack Overflow 还要快...我用了大约20秒钟就找到了在 Ruby 中可以完全做到同样的事情。 - user395760
你不是在要求连接,而是在要求格式化/替换。你应该修改你的问题。顺便说一下,在Ruby中,连接是通过+或<<运算符执行的。 - David
4个回答

270

最简单的方法是使用字符串插值。你可以直接将小片段的 Ruby 代码注入到你的字符串中。

name1 = "John"
name2 = "Mary"
"hello, #{name1}.  Where is #{name2}?"

在Ruby中,您也可以使用格式化字符串。

"hello, %s.  Where is %s?" % ["John", "Mary"]

记得使用方括号。Ruby 没有元组,只有数组,而数组使用方括号。


1
我肯定会使用第一个,它对我来说更易读。 - David
1
第一个不起作用,#{}寻找变量,因此在这种情况下它将打印John变量,而不是字符串“John”。第二个看起来正确。 - Jason Noble
12
你还应该小心,始终使用双引号,因为'#{name1}'"#{name1}"不同。 - yurisich
4
单引号中不支持字符串插值,必须使用双引号。例如:'#{"abc"}' # => "\#{\"abc\"}",但你想要的是 "#{"abc"}" # => "abc" - bschlueter
3
第一种方式并不等同于模板无法作为值传递。 - Ondra Žižka
显示剩余3条评论

55

在 Ruby > 1.9 版本中,你可以这样做:

s =  'hello, %{name1}. Where is %{name2}?' % { name1: 'John', name2: 'Mary' }

查看文档


我在那里编辑了Idomatic Ruby的等效内容 - 但现在我注意到已经有一个被接受的答案这样做了 - 又删除了“编辑” :-/ - toong
当使用哈希和字符串%运算符时,如果格式字符串中引用的键符号不存在,则会出现KeyError。 - user1164178

22

几乎一样的方式:

"hello, %s. Where is %s?" % ["John","Mary"]
# => "hello, John. Where is Mary?"

在Ruby中,方括号是否表示元组?我以为方括号是列表... - TIMEX
@TIMEX:这个问题会有所帮助:https://dev59.com/AnRB5IYBdhLWcg3wv5s_ - Manoj Govindan
3
Ruby没有元组(至少没有被整合到语言中)。是的,它是一个数组(Python中的“列表”应该真正称为数组...)。 - user395760

10
实际上几乎相同。
s = "hello, %s. Where is %s?" % ["John","Mary"]

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