【问题标题】:Ruby - inheriting from ArrayRuby - 从数组继承
【发布时间】:2013-10-08 22:58:31
【问题描述】:

我对 Ruby 还是很陌生。 我需要扩展Array 并且我需要我的类来表示二维数组。

我已经这样做了:

class MyExtension < Array

    def initialize(n)
        super(n, Array.new(n, nil))
        self[0][0] = "hello"
    end

end

这在理论上看起来对我来说是正确的,但是当我这样做时:

p MyExtension.new(2)

我明白了

[["hello", nil], ["hello", nil]]

而不是预期的:

[["hello", nil], [nil, nil]]

我做错了什么?

【问题讨论】:

    标签: ruby arrays


    【解决方案1】:

    这是初学者经常犯的常见错误。如果您执行super(n, Array.new(n, nil)),那么Array.new(n, nil) 将只计算一次,为每一行提供相同的数组(相同的对象ID)。由于所有行都是同一个数组的重复,因此通过self[0][0] = "hello" 修改一行将更改所有其他行。

    相反,做

    class MyExtension < Array
      def initialize(n)
        super(n){Array.new(n, nil)}
        self[0][0] = "hello"
      end
    end
    
    MyExtension.new(2) # => [["hello", nil], [nil, nil]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多