如果切片发生变化,原始数组也会发生变化?
a = [1, 2, 3]
b = a[1, 2]
b[0] = 42 # due to COW, only b changes, a remains unchanged
预期结果:当运行b[0] = 42
时,a[1]
也会变成42。
编辑:有这方面的图书馆吗?
例如:
a = [1, 2, 3]
b = ArraySlice.new(a, 1, 2)
... # changes in b will be reflected in a
附言我是 Ruby 的新手。我要的和Java的ByteBuffer.slice基本一样.有时这很有用,因为我们可以避免创建太多新的数组对象。
最佳答案
在核心库或标准库中都没有这样的东西,我也不知道有任何第三方库。你将不得不自己动手,可能是这样的:
class ArraySlice
include Enumerable
def initialize(ary=[], start=0, length=ary.size - start)
self.ary, self.start, self.length = ary, start, length
end
def [](*args)
return ArraySlice.new(ary, args.first + start, args.last) if args.size == 2
return ArraySlice.new(ary, args.first.begin + start, if args.first.exclude_end? then args.first.end - args.first.begin - 1 else args.first.end - args.first.begin end) if args.first.is_a?(Range)
ary[args.first + start]
end
def []=(*args, value)
return ary[args.first + start, length] = value if args.size == 2
return ary[Range.new(args.first.begin + start, args.first.end + start, args.first.exclude_end?)] = value if args.first.is_a?(Range)
ary[args.first + start] = value
end
def each(&blk)
ary[start, length].each(&blk)
end
# and so on …
private
attr_accessor :ary, :start, :length
end
a = [1, 2, 3]
b = ArraySlice.new(a, 1, 2)
b[0] = 42
a[1] # => 42
关于arrays - 如何创建共享原始数组实例的 Ruby 数组切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31096222/