У Ruby, чаму мой базавы клас толькі будучы путы адзін раз?

Я ацаніў бы ведаць, чаму асобнік «Cat» ніжэй таксама не паведаміўшы «Гэта жывёла можа:" тэкст, перш чым атрыбуты яго пэўны асобнік. Я чакаю, што выхад, як гэта:

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

Не «кошка» таксама успадкаваць ад Animal класа? Ці не вынікае яго выхад таксама пачынаюцца з «Гэта жывёла можа:" ?

0
Ці дазваляе ваша праца вам усталяваць у свой хатні каталог? Паспрабуйце RVM для ўстаноўкі аўтаномных лалы. rvm.io
дададзена аўтар wjl, крыніца
У ідэале путы «Гэта жывёла можа:" не друкуецца для абодвух. гэта ваш поўны код? якая версія лал вы карыстаецеся?
дададзена аўтар Sabarish Sankar, крыніца
Так, гэта мой поўны код (практыкаванне з ЖЖА лалавага Hard Way). На жаль, я толькі на Рубі 1.8.7 (дурная праца рэч).
дададзена аўтар user2448377, крыніца

9 адказы

Праблема ў кодзе з'яўляецца тое, што:

puts "This animal can:"

запускаецца, калі атрымлівае пэўны клас Animal. Падобна на тое, што вы хочаце, гэта ў инициализаторе:

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

Затым вам трэба патэлефанаваць супер у іншых инициализаторах для выніку вы чакаеце.

5
дададзена
Яны ўспадкуюць метады і г.д. Але код, які вызначае фактычны клас працаваць толькі (як інтэрпрэтаваць/сост ...) адзін раз.
дададзена аўтар Denis de Bernardy, крыніца
Дзякуй. Такім чынам, клас вызначаны толькі адзін раз. Мае сэнс для мяне. Але я ствараю два новых асобнікаў гэтага. Ня гэтыя новыя асобнікі ўспадкуюць рысы базавага класа?
дададзена аўтар user2448377, крыніца

«Гэта жывёла можа:» лінія адбываецца толькі тады, калі вызначаецца клас, так як ён не жыве ў метадзе. Так як жывёлы маюць агульнае паводзіны ў іх инициализаторах, вы можаце прасоўваць инициализатору да класа жывёл.

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!
2
дададзена
Дзякуй. Так, прасоўваючы инициализатору мае больш сэнсу. Рубі Ня паўтарайце сабе філасофію. Добра, працуючы над ёй.
дададзена аўтар user2448377, крыніца

Ўсталяваць name_magic ( каштоўны камень ўсталяваць y_support ) і атрымліваць задавальненне

require 'y_support/name_magic';     

class Animal
  include NameMagic
  def initialize; puts "This animal #{sound}s." end
  def sound; "growl" end
  def speak; puts "#{sound.capitalize}!" end
end

class Dog < Animal
  def sound; "bark" end
end

class Cat < Animal
  def sound; "meow" end
end

def hullo( animal )
  Animal.instance( animal ).speak
end

Rover = Dog.new
#=> This animal barks.
Satan = Cat.new
#=> This animal meows.

hullo :Rover
#=> Bark!

Animal.instances.each( &:speak )
#=> Bark!
#=> Meow!
1
дададзена
Ці ведаеце вы, nokogiri сэр? Калі так, то я задам некалькі пытанняў да вас. Калі ласка, праверце, калі ў вас няма ніякіх праблем. :)
дададзена аўтар Arup Rakshit, крыніца
Я ведаю nokogiri 's існавання як XML-аналізатар. Тым не менш, я ніколі не выкарыстоўваў яго. Я актыўна пазбягаць xml як фармат дадзеных у сваёй працы, аддаючы перавагу Рубі ўнутраны DSL. Акрамя таго, у мяне няма ніякіх праблем, казаць пра што заўгодна.
дададзена аўтар Boris Stitnicky, крыніца

Ўсталяваць name_magic ( каштоўны камень ўсталяваць y_support ) і атрымліваць задавальненне

require 'y_support/name_magic';     

class Animal
  include NameMagic
  def initialize; puts "This animal #{sound}s." end
  def sound; "growl" end
  def speak; puts "#{sound.capitalize}!" end
end

class Dog < Animal
  def sound; "bark" end
end

class Cat < Animal
  def sound; "meow" end
end

def hullo( animal )
  Animal.instance( animal ).speak
end

Rover = Dog.new
#=> This animal barks.
Satan = Cat.new
#=> This animal meows.

hullo :Rover
#=> Bark!

Animal.instances.each( &:speak )
#=> Bark!
#=> Meow!
1
дададзена
Ці ведаеце вы, nokogiri сэр? Калі так, то я задам некалькі пытанняў да вас. Калі ласка, праверце, калі ў вас няма ніякіх праблем. :)
дададзена аўтар Arup Rakshit, крыніца
Я ведаю nokogiri 's існавання як XML-аналізатар. Тым не менш, я ніколі не выкарыстоўваў яго. Я актыўна пазбягаць xml як фармат дадзеных у сваёй працы, аддаючы перавагу Рубі ўнутраны DSL. Акрамя таго, у мяне няма ніякіх праблем, казаць пра што заўгодна.
дададзена аўтар Boris Stitnicky, крыніца

Ўсталяваць name_magic ( каштоўны камень ўсталяваць y_support ) і атрымліваць задавальненне

require 'y_support/name_magic';     

class Animal
  include NameMagic
  def initialize; puts "This animal #{sound}s." end
  def sound; "growl" end
  def speak; puts "#{sound.capitalize}!" end
end

class Dog < Animal
  def sound; "bark" end
end

class Cat < Animal
  def sound; "meow" end
end

def hullo( animal )
  Animal.instance( animal ).speak
end

Rover = Dog.new
#=> This animal barks.
Satan = Cat.new
#=> This animal meows.

hullo :Rover
#=> Bark!

Animal.instances.each( &:speak )
#=> Bark!
#=> Meow!
1
дададзена
Ці ведаеце вы, nokogiri сэр? Калі так, то я задам некалькі пытанняў да вас. Калі ласка, праверце, калі ў вас няма ніякіх праблем. :)
дададзена аўтар Arup Rakshit, крыніца
Я ведаю nokogiri 's існавання як XML-аналізатар. Тым не менш, я ніколі не выкарыстоўваў яго. Я актыўна пазбягаць xml як фармат дадзеных у сваёй працы, аддаючы перавагу Рубі ўнутраны DSL. Акрамя таго, у мяне няма ніякіх праблем, казаць пра што заўгодна.
дададзена аўтар Boris Stitnicky, крыніца

Ваш клас жывёл не вызначае канструктар, а таксама не выклікаюцца спадкаемцамі:

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
1
дададзена
Я меў на ўвазе инициализатору, ды гэта лічыцца рэгулярным метадам рубінам (амаль).
дададзена аўтар Louis Kottmann, крыніца
З Вікіпедыі : Канструктар нагадвае метад асобніка, але яна выдатная ад метад у тым, што ён не мае відавочнага якое вяртаецца тыпу, ня няяўна ўспадкоўваюцца і ён звычайна мае розныя правілы для мадыфікатараў вобласці бачнасці. Існуе значна больш для вас, каб прачытаць пра канструктарах.
дададзена аўтар Dan Garman, крыніца
Дзякуй. Ці з'яўляецца «канструктар» такі ж, як метад/функцыі?
дададзена аўтар user2448377, крыніца

Ваш клас жывёл не вызначае канструктар, а таксама не выклікаюцца спадкаемцамі:

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
1
дададзена
Я меў на ўвазе инициализатору, ды гэта лічыцца рэгулярным метадам рубінам (амаль).
дададзена аўтар Louis Kottmann, крыніца
З Вікіпедыі : Канструктар нагадвае метад асобніка, але яна выдатная ад метад у тым, што ён не мае відавочнага якое вяртаецца тыпу, ня няяўна ўспадкоўваюцца і ён звычайна мае розныя правілы для мадыфікатараў вобласці бачнасці. Існуе значна больш для вас, каб прачытаць пра канструктарах.
дададзена аўтар Dan Garman, крыніца
Дзякуй. Ці з'яўляецца «канструктар» такі ж, як метад/функцыі?
дададзена аўтар user2448377, крыніца

Ваш клас жывёл не вызначае канструктар, а таксама не выклікаюцца спадкаемцамі:

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
1
дададзена
Я меў на ўвазе инициализатору, ды гэта лічыцца рэгулярным метадам рубінам (амаль).
дададзена аўтар Louis Kottmann, крыніца
З Вікіпедыі : Канструктар нагадвае метад асобніка, але яна выдатная ад метад у тым, што ён не мае відавочнага якое вяртаецца тыпу, ня няяўна ўспадкоўваюцца і ён звычайна мае розныя правілы для мадыфікатараў вобласці бачнасці. Існуе значна больш для вас, каб прачытаць пра канструктарах.
дададзена аўтар Dan Garman, крыніца
Дзякуй. Ці з'яўляецца «канструктар» такі ж, як метад/функцыі?
дададзена аўтар user2448377, крыніца

Сапраўды!

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

калі рубінавы аналізатар прачытаць код гэта ацаніць усе на шляху. Я маю на ўвазе, нават калі вы не будзеце ствараць якой-небудзь аб'ект будзе адлюстроўваць «Гэта жывёла можа:" Вось чаму вы бачылі, што ў першы раз, і было ўражанне, што клас Dog правільна працаваў

0
дададзена
Хм. Добра. Дзякуй.
дададзена аўтар user2448377, крыніца