Ruby 中的字符串连接
我正在寻找一种更优雅的方式来连接 Ruby 中的字符串。
我有以下几行:
source = "#{ROOT_DIR}/" << project << "/App.config"
有更好的方法吗?
那么 <<
和 +
之间有什么区别?
I am looking for a more elegant way of concatenating strings in Ruby.
I have the following line:
source = "#{ROOT_DIR}/" << project << "/App.config"
Is there a nicer way of doing this?
And for that matter what is the difference between <<
and +
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(16)
您可以通过多种方式做到这一点:
<<
所示,但这不是通常方式使用字符串插值
使用
+
从我所看到的(虽然没有测量)来看,第二种方法似乎在内存/速度方面更有效。 当 ROOT_DIR 为零时,所有这三个方法都会抛出未初始化的常量错误。
处理路径名时,您可能需要使用 File.join 来避免弄乱路径名分隔符。
归根结底,这是一个品味问题。
You can do that in several ways:
<<
but that is not the usual wayWith string interpolation
with
+
The second method seems to be more efficient in term of memory/speed from what I've seen (not measured though). All three methods will throw an uninitialized constant error when ROOT_DIR is nil.
When dealing with pathnames, you may want to use
File.join
to avoid messing up with pathname separator.In the end, it is a matter of taste.
+
运算符是正常的连接选择,并且可能是连接字符串的最快方法。+
和<<
之间的区别在于<<
更改其左侧的对象,而+
没有。The
+
operator is the normal concatenation choice, and is probably the fastest way to concatenate strings.The difference between
+
and<<
is that<<
changes the object on its left hand side, and+
doesn't.如果您只是连接路径,您可以使用 Ruby 自己的 File.join 方法。
If you are just concatenating paths you can use Ruby's own File.join method.
来自 http://greyblake.com/blog/2012/09/02 /ruby-perfomance-tricks/
使用
<<
又名concat
比+=
更高效,因为后者创建一个临时对象并用新对象覆盖第一个对象。输出:
from http://greyblake.com/blog/2012/09/02/ruby-perfomance-tricks/
Using
<<
akaconcat
is far more efficient than+=
, as the latter creates a temporal object and overrides the first object with the new object.output:
由于这是一条路径,我可能会使用数组并加入:
Since this is a path I'd probably use array and join:
这是另一个受这个要点启发的基准测试。 它比较动态字符串和预定义字符串的串联 (
+
)、追加 (<<
) 和插值 (#{}
)。输出:
结论:MRI 中的插值很重。
Here's another benchmark inspired by this gist. It compares concatenation (
+
), appending (<<
) and interpolation (#{}
) for dynamic and predefined strings.output:
Conclusion: interpolation in MRI is heavy.
我更喜欢使用路径名:
关于 ruby 文档中的
<<
和+
:+
:返回一个 new 包含 other_str 连接到 str 的字符串<<
:将给定对象连接到 str。 如果对象是 0 到 255 之间的 Fixnum,则在连接之前将其转换为字符。所以区别在于第一个操作数会变成什么(
<<
进行适当的更改,+
返回新字符串,因此内存更重)以及第一个操作数会是什么is Fixnum(<<
将添加,就好像它是代码等于该数字的字符,+
将引发错误)I'd prefer using Pathname:
about
<<
and+
from ruby docs:+
: Returns a new String containing other_str concatenated to str<<
: Concatenates the given object to str. If the object is a Fixnum between 0 and 255, it is converted to a character before concatenation.so difference is in what becomes to first operand (
<<
makes changes in place,+
returns new string so it is memory heavier) and what will be if first operand is Fixnum (<<
will add as if it was character with code equal to that number,+
will raise error)让我向您展示我的所有经验。
我有一个返回 32k 记录的查询,对于每条记录,我调用一个方法将该数据库记录格式化为格式化字符串,然后将其连接到一个字符串中,该字符串在所有此过程结束时将变成磁盘中的文件。
我的问题是,根据记录,在 24k 左右,连接字符串的过程变得很痛苦。
我使用常规的“+”运算符来做到这一点。
当我更改为“<<”时 就像魔法一样。 真的很快。
所以,我记得我以前的时光 - 大概是 1998 年 - 当时我使用 Java 并使用“+”连接字符串,并从 String 更改为 StringBuffer(现在我们,Java 开发人员拥有 StringBuilder)。
我相信 + / << 的过程 在Ruby世界中与Java世界中的+/StringBuilder.append相同。
第一个重新分配内存中的整个对象,另一个只是指向一个新地址。
Let me show to you all my experience with that.
I had an query that returned 32k of records, for each record I called a method to format that database record into a formated string and than concatenate that into a String that at the end of all this process wil turn into a file in disk.
My problem was that by the record goes, around 24k, the process of concatenating the String turned on a pain.
I was doing that using the regular '+' operator.
When I changed to the '<<' was like magic. Was really fast.
So, I remembered my old times - sort of 1998 - when I was using Java and concatenating String using '+' and changed from String to StringBuffer (and now we, Java developer have the StringBuilder).
I believe that the process of + / << in Ruby world is the same as + / StringBuilder.append in the Java world.
The first reallocate the entire object in memory and the other just point to a new address.
你说串联? 那么
#concat
方法怎么样?平心而论,
concat
的别名为<<
。Concatenation you say? How about
#concat
method then?In all fairness,
concat
is aliased as<<
.这里有更多方法可以做到这一点:
等等......
Here are more ways to do this:
And so on ...
您还可以使用
%
,如下所示:此方法也适用于
'
(单)引号。You can also use
%
as follows:This approach works with
'
(single) quotation mark as well.您可以直接在字符串定义中连接:
You can concatenate in string definition directly:
您可以使用
+
或<<
运算符,但在 ruby 中.concat
函数是最优选的,因为它比其他运营商。 你可以像这样使用它。You may use
+
or<<
operator, but in ruby.concat
function is the most preferable one, as it is much faster than other operators. You can use it like.情况很重要,例如:
在第一个示例中,与
+
运算符连接不会更新output
对象,但是,在第二个示例中,<< ;
运算符将在每次迭代时更新output
对象。 因此,对于上述类型的情况,<<
更好。Situation matters, for example:
In the first example, concatenating with
+
operator will not update theoutput
object,however, in the second example, the<<
operator will update theoutput
object with each iteration. So, for the above type of situation,<<
is better.对于您的特定情况,您还可以在构造字符串的文件路径类型时使用 Array#join :
这具有自动将不同类型转换为字符串的令人愉快的副作用:
For your particular case you could also use
Array#join
when constructing file path type of string:This has a pleasant side effect of automatically converting different types to string:
对于木偶:
For Puppet: