数组#转移如何工作? (或任何破坏性方法)

时间:2015-04-09 03:59:23

标签: ruby

我想模仿array #shift如何在ruby中工作,但是在字符串上。基本上,我想重新打开String并添加一个破坏性地更改字符串并返回它删除的字符的方法:

class String
  def shift
    char = self[0]
    # I thought this would work... not so fast!
    self = self[1..-1]
    char
  end
end

总有意义的是,你无法改变自我的价值,但那么阵列#转移怎么做呢?它甚至看起来像你引用的数组self指向内存中的不同对象

array = [1,2,3]
array.object_id #=> 70215380977180
array.shift
array = [2,3]
array.object_id #=> 70215380977180.. da fuq

这是如何运作的?

1 个答案:

答案 0 :(得分:3)

Array#shift!implemented in C,可以直接在底层数组存储上运行。

您可以使用String#slice!

来模仿此内容
> str = "foobar"
 => "foobar"
> str.slice!(0, 1)
 => "f"
> str
 => "oobar"

如果你想在String上实现这个:

class String
  def shift(n = 1)
    slice!(0, n)
  end
end