我想解释一下我在 Koan 中遇到的 Ruby 行为



那么,只是电铲操作员修改了原始字符串吗?为什么这样做,它看起来像:

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,那么现在foobar是同一对象的两个名称。

但是,如果执行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

相关内容

最新更新