16

我正在使用 rubocop 基本上清理我凌乱的代码......

其中一个错误是:

使用 \ 而不是 + 或 << 来连接这些字符串。

为什么是这样?

我在Ruby 文档中找不到它。为什么我要使用\而不是+or <<

4

2 回答 2

27

在 Ruby 中,文字字符串在遇到时被分配为内存中的对象。如果您连接两个字符串文字,如

str = "foo" + "bar"

您实际上将分配三个String对象:"foo""bar"连接的结果(然后由 引用str)。

如果您这样做,也会发生同样的情况:

"foo" << "bar"

在许多情况下,这只是轻微的低效率,您不必太担心。

但是,请注意,如果您在循环中执行此操作,并且聚合String变大,您将在每次迭代时分配一个更大的String对象(您可以通过收集字符串部分来避免这种情况Array,然后join在完成时调用; 同样,foo << 'bar'foo就地修改,这在循环中是可以接受的)。

通过使用\,您不会连接中间对象,而是有效地为解析器提供一个String文字(因为\只需在下一行继续字符串)。

这个"foo" + "bar" + "baz"习语在 Java 中经常使用,其中字符串是不可变的,并且在编译时将文字连接起来。(Java 中的每个字符串文字只存储一次,然后在整个代码中重复使用;Ruby 不会这样做。)此外,Java 没有更好的方法来在多行中继续字符串,这就是 Java 程序员这样做的原因。

于 2014-04-29T01:43:57.427 回答
4

\在行尾将阻止解释器将换行符视为语句结束。因此,您可以制作多行字符串,而无需花费连接或附加的成本。

于 2014-04-29T00:05:00.163 回答