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

标签 arrays ruby

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

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/

相关文章:

javascript slice 在相同的结构化数组上执行不同的操作

javascript - 如何向 div 的所有子节点和这些 div 的数组添加事件监听器?

c - 用可变数量的参数构建一个字符串

ruby 在远程机器上运行命令

每个 3 个值的数据集的 Ruby 解决方案

ruby-on-rails - Ruby on Rails Devise——编辑配置文件后重定向

mysql - 文件存储在 Ruby/Rake/Grape 服务器上

java - 添加到缺少元素的 JsonArray 结果

javascript - Ruby on Rails - 将地理编码器对象作为谷歌地图标记数组

php - 如何使用自定义条件从 PHP 中的多维数组中删除重复值