我想模拟数组#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