那么,只是电铲操作员修改了原始字符串吗?为什么这样做,它看起来像:
hi = original_string
表现得像个指针吗?我能了解一下什么时候、如何以及为什么会这样吗?
def test_the_shovel_operator_modifies_the_original_string
original_string = "Hello, "
hi = original_string
there = "World"
hi << there
assert_equal "Hello, World", original_string
# THINK ABOUT IT:
#
# Ruby programmers tend to favor the shovel operator (<<) over the
# plus equals operator (+=) when building up strings. Why?
end
在ruby中,一切都是引用。如果执行foo = bar
,那么现在foo
和bar
是同一对象的两个名称。
但是,如果执行foo = foo + bar
(或者等效地,foo += bar
),则foo
现在引用一个新对象:一个是计算foo + bar
的结果。
就像某种指针
它被称为引用语义。在Python中,Ruby的变量引用值,而不是包含值。这对于动态类型语言来说是正常的,因为当变量始终只是一个引用,而不是必须神奇地改变大小才能容纳不同类型的值时,实现"值有类型,变量没有"逻辑要容易得多。
至于实际的koan,请参阅为什么在Ruby中构建字符串时,铲运算符(<<)比加号(+=)更受欢迎。
字符串只是一个字符序列,<lt;运算符允许您在此序列中添加更多字符。有些语言有不可变的字符串,比如Java和C#,另一些语言有可变的字符串(比如C++),这并没有什么错,这只是语言设计者认为必要的。
在Java中,当你需要通过合并许多较小的字符串来创建一个大字符串时,你会首先使用StringBuilder,然后在最后用它构建一个真正的字符串。在Ruby中,你可以继续使用<lt向该字符串添加更多字符,就这样。
主要区别在于使用<lt比"one_string+other_string"快得多,因为+运算符生成一个新字符串,而不是附加到one_string。