我正在寻找一种在Ruby中连接字符串的更优雅的方式。

我有如下一行:

source = "#{ROOT_DIR}/" << project << "/App.config"

有更好的方法吗?

那么<<和+之间有什么区别呢?


当前回答

对于你的特殊情况,你也可以使用array# join构造文件路径类型的字符串:

string = [ROOT_DIR, project, 'App.config'].join('/')]

这有一个令人愉快的副作用,自动将不同类型转换为字符串:

['foo', :bar, 1].join('/')
=>"foo/bar/1"

其他回答

让我给你们看看我的经验。

我有一个返回32k记录的查询,对于每个记录,我调用一个方法将该数据库记录格式化为一个格式化的字符串,然后将其连接到一个字符串,在所有这个过程结束时将转换为磁盘上的文件。

我的问题是,在24k左右,连接字符串的过程开始变得痛苦。

我用的是常规的“+”运算符。

当我换到'<<'时,就像变魔术一样。真的很快。

所以,我记得我的旧时光-大约1998年-当我使用Java和连接字符串使用'+',从字符串改为StringBuffer(现在我们,Java开发人员有StringBuilder)。

我相信在Ruby世界中+ / <<的过程和+ / StringBuilder是一样的。在Java世界中追加。

第一个在内存中重新分配整个对象,另一个只是指向一个新地址。

你说的是串联?那么#concat方法呢?

a = 'foo'
a.object_id #=> some number
a.concat 'bar' #=> foobar
a.object_id #=> same as before -- string a remains the same object

公平地说,concat别名为<<。

情况很重要,例如:

# this will not work
output = ''

Users.all.each do |user|
  output + "#{user.email}\n"
end
# the output will be ''
puts output

# this will do the job
output = ''

Users.all.each do |user|
  output << "#{user.email}\n"
end
# will get the desired output
puts output

在第一个示例中,与+操作符连接将不会更新输出对象,然而,在第二个示例中,<<操作符将在每次迭代中更新输出对象。因此,对于上述类型的情况,<<更好。

您可以使用+或<<操作符,但在ruby中.concat函数是最可取的,因为它比其他操作符快得多。你可以用它。

source = "#{ROOT_DIR}/".concat(project.concat("/App.config"))

这里有更多的方法:

"String1" + "String2"

"#{String1} #{String2}"

String1<<String2

等等……