我正在寻找一种在Ruby中连接字符串的更优雅的方式。
我有如下一行:
source = "#{ROOT_DIR}/" << project << "/App.config"
有更好的方法吗?
那么<<和+之间有什么区别呢?
我正在寻找一种在Ruby中连接字符串的更优雅的方式。
我有如下一行:
source = "#{ROOT_DIR}/" << project << "/App.config"
有更好的方法吗?
那么<<和+之间有什么区别呢?
当前回答
让我给你们看看我的经验。
我有一个返回32k记录的查询,对于每个记录,我调用一个方法将该数据库记录格式化为一个格式化的字符串,然后将其连接到一个字符串,在所有这个过程结束时将转换为磁盘上的文件。
我的问题是,在24k左右,连接字符串的过程开始变得痛苦。
我用的是常规的“+”运算符。
当我换到'<<'时,就像变魔术一样。真的很快。
所以,我记得我的旧时光-大约1998年-当我使用Java和连接字符串使用'+',从字符串改为StringBuffer(现在我们,Java开发人员有StringBuilder)。
我相信在Ruby世界中+ / <<的过程和+ / StringBuilder是一样的。在Java世界中追加。
第一个在内存中重新分配整个对象,另一个只是指向一个新地址。
其他回答
这里有更多的方法:
"String1" + "String2"
"#{String1} #{String2}"
String1<<String2
等等……
你可以通过以下几种方式做到这一点:
正如你用<<所示,但这不是通常的方式 用字符串插值 source = "#{ROOT_DIR}/#{项目}/App.config" 与+ source = "#{ROOT_DIR}/" + project + "/App.config"
据我所见,第二种方法在内存/速度方面似乎更有效(虽然没有测量过)。当ROOT_DIR为nil时,这三个方法都会抛出一个未初始化的常量错误。
在处理路径名时,您可能希望使用File。连接以避免混淆路径名分隔符。
说到底,这是一个品味问题。
情况很重要,例如:
# 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
在第一个示例中,与+操作符连接将不会更新输出对象,然而,在第二个示例中,<<操作符将在每次迭代中更新输出对象。因此,对于上述类型的情况,<<更好。
你也可以这样使用%:
source = "#{ROOT_DIR}/%s/App.config" % project
这种方法也适用于'(单)引号。
让我给你们看看我的经验。
我有一个返回32k记录的查询,对于每个记录,我调用一个方法将该数据库记录格式化为一个格式化的字符串,然后将其连接到一个字符串,在所有这个过程结束时将转换为磁盘上的文件。
我的问题是,在24k左右,连接字符串的过程开始变得痛苦。
我用的是常规的“+”运算符。
当我换到'<<'时,就像变魔术一样。真的很快。
所以,我记得我的旧时光-大约1998年-当我使用Java和连接字符串使用'+',从字符串改为StringBuffer(现在我们,Java开发人员有StringBuilder)。
我相信在Ruby世界中+ / <<的过程和+ / StringBuilder是一样的。在Java世界中追加。
第一个在内存中重新分配整个对象,另一个只是指向一个新地址。