gpt4 book ai didi

arrays - 如何创建共享原始数组实例的 Ruby 数组切片?

转载 作者:太空宇宙 更新时间:2023-11-03 18:12:52 25 4
gpt4 key购买 nike

如果切片发生变化,原始数组也会发生变化?

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com