0

"Cat"以下のインスタンスが"This animal can:"特定のインスタンス属性の前にテキストを配置しない理由を知っていただければ幸いです。次のような出力を期待しています。

This animal can:
Say it's name: 'Rover'
Bark
This animal can:
Say its name: 'Satan'
Meow

コードは次のとおりです。

class Animal
    puts "This animal can:"
end

class Dog < Animal
    def initialize(name)
        @name = name
        puts "Say its @name: '%s'" % [name]
    end
    def bark
        puts "Bark"
    end
end

class Cat < Animal
    def initialize(name)
        @name = name
        puts "Say its @name: '%s'" % [name]
    end
    def meow
        puts "Meow"
    end
end

rover = Dog.new("Rover").bark
satan = Cat.new("Satan").meow

私が見ているのはこれです:

This animal can:
Say it's name: 'Rover'
Bark
Say its name: 'Satan'
Meow

クラス"cat"からも継承しませんか?Animalその出力も で始まるべきではありません"This animal can:"か?

4

5 に答える 5

5

コードの問題は次のとおりです。

puts "This animal can:"

Animal クラスが定義されたときに実行されます。イニシャライザでこれが必要なようです:

class Animal
  def initialize(name)
    puts "This animal can:"
  end
end

super次に、期待する結果を得るために、他の初期化子を呼び出す必要があります。

于 2013-06-03T15:16:14.070 に答える
2

"This Animal can:" 行は、クラスがメソッド内にないため、クラスが定義されている場合にのみ発生します。どちらの動物もイニシャライザで共通の動作をするため、イニシャライザを Animal クラスにプロモートすることをお勧めします。

class Animal
  def introduce_myself
    puts "Hello! My name is #{@name} and I know how to: "
  end

  def initialize(name)
    @name = name
    introduce_myself
  end
end

class Dog < Animal
  def bark
    puts "Woof!"
  end
end

class Cat < Animal
  def meow
    puts "Meow!"
  end
end

Dog.new("Fido").bark
Cat.new("Sparky").meow

出力:

Hello! My name is Fido and I know how to: 
Woof!
Hello! My name is Sparky and I know how to: 
Meow!
于 2013-06-03T15:20:06.773 に答える
1

Animal クラスはコンストラクターを定義しておらず、継承者によって呼び出されていません。

class Animal
   def initialize
      puts "This animal can:"
   end
end

class Dog < Animal    
   def initialize(name)
       super()
       @name = name
       puts "Say its @name: '%s'" % [name]
   end

   def bark
       puts "Bark"
   end    
end
于 2013-06-03T15:17:57.137 に答える
0

丁度!

class Animal
  def initialize(name)
    puts "This animal can:"
  end
end

def initialize(name)
  @name = name
  puts "Say its @name: '%s'" % [name]
  super # initializer from parent class
end

なぜそれがうまくいかないのですか?

class Animal
  puts "This animal can:"
end

Rubyパーサーがコードを読み取ると、途中ですべてが評価されます。つまり、オブジェクトを作成しなくても、「This animal can:」と表示されるので、初めてそれを見て、Dog クラスが正しく機能しているという印象を受けました。

于 2013-06-03T15:20:38.863 に答える