我想模仿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
这是如何运作的?
答案 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