web-dev-qa-db-ja.com

ruby

どうすれば親コンストラクタを呼び出すことができますか?

module C
    attr_accessor :c, :cc
    def initialization c, cc
        @c, @cc = c, cc
    end 
end

class B
    attr_accessor :b, :bb
    def initialization b, bb
        @b, @bb = b, bb
    end 
end


class A < B
    include C
    attr_accessor :a, :aa
    def initialization (a, b, c, aa, bb, cc)
        #call B::initialization - ?
        #call C::initialization - ?
        @a, @aa = a, aa
    end
end

ありがとう。

28
Stan Kurilin

まず、メソッドはinitializeではなくinitializationにする必要があります。次に、superを使用して親クラスのメソッドを呼び出すことができます。 CでのAのイニシャライザの呼び出しについては、明確にするために、初期化要素を別の関数に分割して、その関数を直接呼び出すことをお勧めします。実装は簡単で、より明確です。

25
Peter

Rubyにはコンストラクターがないため、それらを親などから呼び出すことは明らかに不可能です。 Ruby doesにはメソッドがありますが、現在実行中のメソッドと同じ名前で親のメソッドを呼び出すには、superキーワードを使用できます。[注意:引数なしのsuperは、現在実行中のメソッドに渡されたものと同じ引数を渡すためのショートカットです。実際にno引数を渡したい場合は、明示的に渡す必要があります:super()。]

38
Jörg W Mittag

superメソッドを使用してください! Rubyには多重継承はありませんが。

class B

  attr_accessor :b, :bb

  def initialize(b, bb)
    @b, @bb = b, bb
  end

end

module C

end

class A < B
  include C  # <= if C was a class, you'd get: TypeError: wrong argument type Class (expected Module)

  attr_accessor :a, :aa

  def initialize(a,b,aa,bb)
    @a, @aa = a, aa
    super(b, bb)  # <= calls B#initialize
  end

end

a = A.new(1,2,3,4)
puts a.inspect # => #<A:0x42d6d8 @aa=3, @a=1, @b=2, @bb=4>
28
maček

以下のこのコードは印刷されます:

A.proc1 B.proc1 C.proc1

module A
  def proc1
    puts "A.proc1"
    super
  end
end

class B
  def proc1
    puts "B.proc1"
  end
end

class C < B
  include A
  def proc1
    super
    puts "C.proc1"
  end
end

C.new.proc1
7
parzival