3

私はRubyに慣れていないので、おそらく初心者の質問を許しますが、Googleはこれまでのところ役に立ちませんでした.

親クラスで定義されたクラス定数があります

Items = [[1, 3, 5], [2, 4, 6]]

そして、配列 [1, 5, 9] を Items 配列に追加するサブクラスがあります。スーパーの参照/定数の再定義などはできますか?

何かのようなもの

Items = super.Items.concat([1, 5, 9])

アイテムの定義を、追加のアイテムを使用してサブクラスにコピーする必要がないようにしたいと思います。

4

3 に答える 3

6

定数は、それらが定義されているクラスまたはモジュール内で名前の間隔が空けられています。それらは通常の祖先パスを介して解決されます。サブクラスでは、スーパークラスの定数と同じ名前の定数を定義できます。サブクラスの定数は最初の割り当てが完了するまで定義されないため、それを初期化する式はスーパークラスの定数を参照できます。このような:

$ pry
[1] pry(main)> class A; Items = [[1, 3, 5], [2, 4, 6]]; end
=> [[1, 3, 5], [2, 4, 6]]
[2] pry(main)> class B < A; end
=> nil
[3] pry(main)> class B; Items; end
=> [[1, 3, 5], [2, 4, 6]]
[4] pry(main)> A::Items
=> [[1, 3, 5], [2, 4, 6]]
[5] pry(main)> B::Items
=> [[1, 3, 5], [2, 4, 6]]
[6] pry(main)> class B; Items = Items.dup << [7,8,9]; end
=> [[1, 3, 5], [2, 4, 6], [7, 8, 9]]
[7] pry(main)> A::Items
=> [[1, 3, 5], [2, 4, 6]]
[8] pry(main)> B::Items
=> [[1, 3, 5], [2, 4, 6], [7, 8, 9]]

dup新しい定数を導出するとき、変更方法(など)を使用して変更する場合は、元の定数に注意してくださいArray#<<。トラップを参照してください:

[9] pry(main)> class A; Foo = [[1,2],[3,4]]; end
=> [[1, 2], [3, 4]]
[10] pry(main)> A::Foo
=> [[1, 2], [3, 4]]
[11] pry(main)> class B; Foo = Foo << [5,6]; end
=> [[1, 2], [3, 4], [5, 6]]
[12] pry(main)> B::Foo
=> [[1, 2], [3, 4], [5, 6]]
[13] pry(main)> A::Foo
=> [[1, 2], [3, 4], [5, 6]]
[14] pry(main)> B::Foo.object_id == A::Foo.object_id
=> true
[15] pry(main)> B::Items.object_id == A::Items.object_id
=> false

を使用してスーパークラスに名前を付けることなく、親名前空間の定数を明示的に参照できます。Class#superclass

[16] pry(main)> class B; superclass::Items; end
=> [[1, 3, 5], [2, 4, 6]]
于 2013-03-04T00:36:16.293 に答える
4

一定のルックアップは、Rubyで常に非常に明白であるとは限りません。特に、通常はスコープが設定されていないためです(たとえば、次のように記述Stringします::String) 。

サブクラスでオーバーライドできます。あなたはそれにアクセスすることによってそれを構築することができますsuperclass

class C < Base
  CONST = build_on(superclass::CONST)
end

ただし、インスタンスメソッドとシングルトンメソッドから定数にアクセスする方法については注意が必要です。

class Base
  FOO = [42]

  def self.naive
    FOO
  end

  def naive_ins
    FOO
  end

  def self.aware
    self::FOO
  end

  def aware_ins
    self.class::FOO
  end
end

class C < Base
  FOO = superclass::FOO + [:bar]
end

C.naive # => [42]
C.new.naive_ins # => [42]
C.aware # => [42, :bar]
C.new.aware_ins # => [42, :bar]
于 2013-03-04T00:36:02.417 に答える
0

定数は、定義されているクラスにスコープされます。そのため、必要に応じてサブクラスで定数を再定義できます。

于 2013-03-04T00:21:58.230 に答える