1

以下で受け取ったエラーに誰かが光を当ててくれることを願っています。親クラスでインスタンス変数を定義Nodeし、サブクラスでアクセスして変更したいのですが、アクセスAddSubNodeしようとすると、次の@codeエラーが表示されます。

'code': undefined method `<<' for nil:NilClass (NoMethodError)

Rubyの継承モデルを誤解しているのでしょうが、これならいけると思いました。

class Node
  attr_accessor :code

  def initialize
    @code = []
  end
end

class AddSubNode < Node
  def initialize op, l, r
    @op = op
    @l  = l
    @r  = r
  end

  def code
    @code << 1 # error: `code': undefined method `<<' for nil:NilClass (NoMethodError)
    @code
  end

  def to_s
    "#{@l} #{@op} #{@right}"
  end
end
4

3 に答える 3

4

サブクラスの初期化子でスーパー初期化子を呼び出す必要があります。

class AddSubNode < Node
  def initialize op, l, r
    super()
    @op = op
    @l  = l
    @r  = r
  end
...

編集:括弧を忘れた

于 2013-04-14T22:14:20.953 に答える
2

initializeサブクラスでメソッドを再定義すると、元のメソッドが上書きされます。したがって、インスタンス変数@codeは決して初期化されず、コードを呼び出すとエラーがスローされます@code << 1

super()サブクラスのメソッドから呼び出すinitialize(効果的にその親を呼び出す) か、または利用すること@code << 1 unless @code.nil?は、エラーに対処するいくつかの方法です。

于 2013-04-14T22:18:34.763 に答える