如何创建一个共享原始数组相同实例的Ruby数组切片?

时间:2015-06-28 04:43:46

标签: 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

P.S。我是Ruby的新手。我想要的基本上与Java的ByteBuffer.slice相同。有时这很有用,因为我们可以避免创建太多新的数组对象。

4 个答案:

答案 0 :(得分:2)

在核心库或标准库中没有类似的东西,我也不知道任何第三方库。你必须自己动手,这样的事情可能是:

Enumerable.Range(1, 10).Select(n => n%2 == 0).ToString().ToList().ForEach(Console.WriteLine);

答案 1 :(得分:1)

我认为这是不可能的。虽然a和b引用相同的对象,但引用本身是不同的。因此,更新一个参考不会更新另一个参考。如果您更改基础对象,则它们会按预期运行。

a = [{}, {}, {}]
b = a[1,2]

b[0][:copy?] = true

puts a.inspect
#[{}, {:copy?=>true}, {}]

答案 2 :(得分:0)

[]创建一个新数组。来自docs

  

返回一个填充了给定对象的新数组。

由于它是副本,因此更改新数组不会更改原始数组。

答案 3 :(得分:0)

a = ["a", "b", "c"]
b = a[1, 2]
b.each{|str| str << "!"}

p a # => ["a", "b!", "c!"]

对整数等不可变对象不起作用。