3

(Rubyでの作業)まず、事前にお詫び申し上げます。私はトレーニングによるプログラマーではありません。便利さと変化する世界のおかげで、プログラマーにたどり着きました。私がする必要があるのはプログラミングでした、そして私は他の人が私のプログラミングをしてくれるのを待つのにうんざりしていました。そのため、途中でいくつかの基本的な概念を見逃してしまいました。これらの質問をすると、結果として自分自身をばかにすることがあります。

クラスで種と仕事の関係を定義したいとしましょう。スーパークラス「BlackAnt」を定義し、サブクラス「Worker」、「Fighter」、「Queen」を作成したい

私には、直感的に、これは次のようになります。

class BlackAnt
  @legs = 6
end

class Worker < BlackAnt
  @jaws = 'small'
end

しかし、私がそれから試してみると

ant1 = Worker.new
puts ant1.legs

エラーが発生します。クラスBlackAntを次のように修正した場合:

class BlackAnt
  attr_accessor :legs
  @legs = 6
end

ant1.legsは'nil'を返します

ここで概説されている方法を試しました:http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/

これにより、Worker.legsは「6」を返すことができますが...残念ながら:

ant1 = Worker.new
Worker.legs => '6'
ant1.legs => 'nil'

推測では、これらの親変数の値は、新しい子が生成されるたびに初期化されていません。

どういうわけか私はこれについてばかげていると感じます、そしてその返事は私がカフェイン駆動のオールナイトを発見した日を私に呪わせることは間違いありません。私がする必要があるのは、次のようなオブジェクトを作成できるように配置することです。

ant1 = Worker.new
ant2 = Queen.new
ant3 = Fighter.new

そして、子供クラスで割り当てられた特別な特性とともに、それぞれに適切な数の脚を取得させます。ワーカー/クイーン/ファイターの分類は、実際の呼び出しが次のようになるように名前空間によってバインドされます。

ant1 = AntBlack::Worker.new
ant2 = AntRed::Worker.new
ant3 = AntRed::Queen.new

次に、以下を使用して個々のアリの足の数を確認できるようにしたいと思います。

ant1.legs #=> 6

ひじを回って親指にたどり着くかもしれません。もしそうなら、同じ結果を達成する方法についての代替案を自由に提供してください、私は洞察に大いに感謝します。

///更新されたre:response ///

class AntRed
  attr_accessor :legs
  def initialize
    @legs = 6
  end
end

class Worker < AntRed
  @strength = 1
end

結果:

irb(main):009:0> ant1 = Worker.new
#=> #<Worker:0x87616ac @strength=1>
irb(main):010:0> ant1.legs
#=> nil
4

3 に答える 3

5

BlackAntクラスを次のように定義します。

class BlackAnt
  attr_accessor :legs

  def initialize
    @legs = 6
  end
end

そしてあなたのWorkerクラスは次のようになります:

class Worker < BlackAnt
  attr_accessor :strength

  def initialize
    super

    @strength = 1
  end
end

現在BlackAntクラスを定義している方法では、レッグをクラスレベルのインスタンス変数として格納しています。

于 2012-12-23T04:26:10.770 に答える
0

推測では、これらの親変数の値は、新しい子が生成されるたびに初期化されていません。

Rubyインスタンスでは、変数は単一のオブジェクトに属します。私の答えの最初のポイント7)を見てください

あなたの「もし本当ならそれらは変数である」に対処するために

Rubyのシンボルが変数の一種と見なされないのはなぜですか?


なぜあなたが得るのか分かりませんirb(main):010:0> ant1.legs #=> nil。私にとっては(少なくともスクリプトとしては)機能します。

class AntRed
  attr_accessor :legs
  def initialize
    @legs = 6
  end
end

class Worker < AntRed
end

ant1 = Worker.new
print 'ant1.legs : '; puts ant1.legs

実行:

$ ruby -w test.rb 
ant1.legs : 6
于 2012-12-23T07:56:47.347 に答える
0

つまり、初期化されたクラスのインスタンス変数が必要です。

だからあなたはこのようにそれを行うことができます:

class BlackAnt
  attr_accessor :legs
  @legs = 6

  def initialize
    @legs = self.class.instance_variable_get(:@legs)
  end
end

newObj = BlackAnt.new
newObj.legs
于 2012-12-28T07:41:34.477 に答える