数组#shift是如何工作的?(或任何破坏性方法)



我想模拟数组#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的值,这是完全有道理的,但数组#shift是如何做到的呢?当self指向内存中的另一个对象时,它看起来甚至不像你引用的数组

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

这是怎么回事?

Array#shift!在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

相关内容

最新更新