如何在Ruby类中初始化类

如何在Ruby类中初始化类,ruby,class,Ruby,Class,我正在学习Ruby,但我被卡住了,所以我有一个问题。 如何在另一个类中初始化该类,这可能吗? 我试着写一个简单的游戏狗的运行。 以下是课程: 给狗上课,展示关于狗的信息 班犬 def初始化速度、名称、重量=0、高度=0、速度=0 @重量=重量 @高度=高度 @_breed=breed.capitalize @_name=name.capitalize @速度=速度 终止 def至美国 狗的信息 他的名字是:{@the_name} 他的品种是:{@the_breed} 他的体重是:{@the_we

我正在学习Ruby,但我被卡住了,所以我有一个问题。 如何在另一个类中初始化该类,这可能吗? 我试着写一个简单的游戏狗的运行。 以下是课程:

给狗上课,展示关于狗的信息

班犬 def初始化速度、名称、重量=0、高度=0、速度=0 @重量=重量 @高度=高度 @_breed=breed.capitalize @_name=name.capitalize @速度=速度 终止 def至美国 狗的信息 他的名字是:{@the_name} 他的品种是:{@the_breed} 他的体重是:{@the_weight}厘米 他的身高是:{@the_height}公斤 他的平均速度是:{@the_speed}公里/小时 终止 终止 班级游戏

班级游戏 def_游戏 luckS=rand0..10 luckR=rand0..10 luckW=rand0..10 如果选择\u dog==Steve\n或选择\u dog==Steve\n或选择\u dog==whippet\n或选择\u dog==whippet\n 如果选择_rate==3.33 让你选择,你的费率是3.33! 游戏开始了! 如果luckS>luckR和luckS>luckW 让你赢! 拿着你的现金。 金钱=金钱+金钱*选择利率 其他的 让你输 金钱=金钱-金钱*选择利率 终止 终止 如果选择_rate==6.66 让你选择,你的费率是6.66! 游戏开始了! 如果luckS>luckR和luckS>luckW 让你赢! 拿着你的现金。 金钱=金钱+金钱*选择利率 其他的 让你输 金钱=金钱-金钱*选择利率 终止 终止 如果选择_rate==10.00 让你选择,你的价格是10.00! 游戏开始了! 如果luckS>luckR和luckS>luckW 让你赢! 拿着你的现金。 金钱=金钱+金钱*选择利率 其他的 让你输 金钱=金钱-金钱*选择利率 终止 终止 终止 如果选择\u dog==Richard\n或选择\u dog==Richard\n或选择\u dog==greyhound\n或选择\u dog==greyhound\n 这是一个很好的选择! 放选择率! 第一个卖出价是3.33,如果你想选择3.33,请填写3.33 第二个利率是3.33,如果你想选择这个利率,请写在6.66 第三种利率是3.33,如果您想选择该利率,请填写10.00 如果选择_rate==3.33 让你选择,你的费率是3.33! 游戏开始了! 如果luckR>luckS和luckR>luckW 让你赢! 拿着你的现金。 金钱=金钱+金钱*选择利率 其他的 让你输 金钱=金钱-金钱*选择利率 终止 终止 如果选择_rate==6.66 让你选择,你的费率是6.66! 游戏开始了! 如果luckR>luckS和luckR>luckW 让你赢! 拿着你的现金。 金钱=金钱+金钱*选择利率 其他的 让你输 金钱=金钱-金钱*选择利率 终止 终止 如果选择_rate==10.00 让你选择,你的价格是10.00! 游戏开始了! 如果luckR>luckS和luckR>luckW 让你赢! 拿着你的现金。 金钱=金钱+金钱*选择利率 其他的 让你输 金钱=金钱-金钱*选择利率 终止 终止 终止 如果选择\u dog==Whilley\n或选择\u dog==Whilley\n或选择\u dog==saluki\n或选择\u dog==saluki\n 这是一个很好的选择! 放选择率! 第一个卖出价是3.33,如果你想选择3.33,请填写3.33 第二个利率是3.33,如果你想选择这个利率,请写在6.66 第三种利率是3.33,如果您想选择该利率,请填写10.00 如果选择_rate==3.33 让你选择,你的费率是3.33! 游戏开始了! 如果luckW>luckS和luckW>luckR 让你赢! 拿着你的现金。 金钱=金钱+金钱*选择利率 其他的 让你输 金钱=金钱-金钱*选择利率 终止 终止 如果选择_rate==6.66 让你选择,你的费率是6.66! 游戏开始了! 如果luckW>luckS和luckW>luckR 让你赢! 拿着你的现金。 金钱=金钱+金钱*选择利率 其他的 让你输 金钱=金钱-金钱*选择利率 终止 终止 如果选择_rate==10.00 让你选择,你的价格是10.00! 游戏开始了! 如果luckW>luckS和luckW>luckR 让你赢! 拿着你的现金。 金钱=金钱+金钱*选择利率 其他的 让你输 金钱=金钱-金钱*选择利率 终止 终止 终止 终止 终止 以及其他必须运行游戏类的代码:

向我们的\狗的跑步问好\ 钱=1000 这是关于我们狗的信息 狗=[DOG.newwhippet,Steve,15,48,50,DOG.新灰狗,Richard,34,73,70,DOG.newsaluki,Whilley,20,61,60] 放狗 请写上狗的名字或品种: 选择\u dog=get.to\u 这是一个很好的选择! 放选择率! 第一个卖出价是3.33,如果你想选择3.33,请填写3.33 第二个利率是3.33,如果你想选择这个利率,请写在6.66 第三种利率是3.33,如果您想选择该利率,请填写10.00 选择\u rate=get.to\u f GAME.new.initialize\u游戏
我更改了大部分代码,但我无法初始化该游戏类,我编写了GAME.new.initialize\u带有类名称和方法的游戏,但这仍然不起作用。

我在这里猜测您的问题,但看看您的代码和注释,您正在尝试将您在上一个代码片段中创建的狗添加到您创建的游戏中

通过以下不同的设计模式,有许多巧妙的方法可以做到这一点,但在学习的过程中,我会坚持使用更简单的方法:告诉游戏类,存在的狗:

class Dog
  attr_reader :name

  def initialize(name)
    @name = name
  end
end

class Game
  attr_reader :dogs

  def initialize(*dogs)
    @dogs = dogs
  end

  def play
    puts "For tonights race we have:"
    dogs.each do |dog|
      puts dog.name
    end
  end
end

d1 = Dog.new('Joe')
d2 = Dog.new('Sally')
d3 = Dog.new('Steve')

game = Game.new(d1, d2, d3)

game.play
您可以选择在创建游戏时自动创建狗:

class Dog
  attr_reader :name

  def initialize(name)
    @name = name
  end
end

class Game
  attr_reader :dogs

  def initialize
    load_dogs
  end

  def play
    puts "For tonights race we have:"
    dogs.each do |dog|
      puts dog.name
    end
  end

  private

  def load_dogs
    @dogs = []
    @dogs << Dog.new('Joe')
    @dogs << Dog.new('Sally')
    @dogs << Dog.new('Steve')
  end
end

game = Game.new

game.play
然后,您可以将您的选择集成到游戏代码中:

class Dog
  attr_reader :name

  def initialize(name)
    @name = name
  end
end

class Game
  attr_reader :dogs

  def initialize
    load_dogs
  end

  def play
    puts "For tonights race we have:"
    dogs.each do |dog|
      puts dog.name
    end

    puts

    choose_your_dog
  end

  private

  def choose_your_dog
    puts "Which dog do you want"
    @choice = gets.to_s.strip
    puts "You choose #{@choice}; great choice!"
  end

  def load_dogs
    @dogs = []
    @dogs << Dog.new('Joe')
    @dogs << Dog.new('Sally')
    @dogs << Dog.new('Steve')
  end
end

game = Game.new

game.play

我运行了你的代码,有一条明显的错误信息。也许您正在以某种方式运行代码,但没有向您显示错误消息

Great pick!
Choose rate!
First rate is 3.33 , please write in 3.33 if you want to pick that rate
Second rate is 3.33 , please write in 6.66 if you want to pick that rate
Third rate is 3.33 , please write in 10.00 if you want to pick that rate
6.66
/Users/schwern/tmp/test.rb:26:in `initialize_game': undefined local variable or method `choose_dog' for #<GAME:0x00007f9a7208a5c0> (NameError)
    from /Users/schwern/tmp/test.rb:171:in `<main>'

你想在CHOOSE类中初始化GAME类,对吗?是的,所以如果我在CHOOSE类中初始化class GAME,我就可以用一个下注游戏进行循环:GAME.new.initialize\u GAME这应该足够了。你的问题是什么?Ruby在名称方面有很强的约定。类遵循类名格式、常量和名称。所有caps类通常都不受欢迎,但HTTP或URI等首字母缩写词除外。另一个要考虑的事情是避免变量DOG1、DOD2等等,而是有一个数组狗= [],你可以把事情放进去,更重要的是,反复迭代。由于重复,这段代码的长度是需要的三倍。为了避免错误,我在游戏类中添加了选择。游戏开始了,但是出现了另一个错误lol:请写上狗的名字或品种:Steve Great pick!选择价格!你选择了3.33,你的价格是3.33!游戏开始了!回溯最近的调用last:3:from/usr/bin/irb:11:in'2:from dogsruns2.rb:165 1:from dogsruns2.rb:42:initialize_game'NoMethodError undefined method`*'for nil:NilClass我只想赚:Money=Money+Money*选择利率现在我不明白了,再一次为我愚蠢的大脑想法感到抱歉。@I.Kyskyn您仍然缺少一个钱或选择费率。我更改了代码,游戏现在运行正常。谢谢大家的帮助。这段代码比我的代码更简单、更高效,有很多方法让我目不转睛,我将尝试在您的示例中简化我的代码,非常感谢:
# In GAME
def initialize_game(choose_dog, choose_rate, money)

# When calling it.
GAME.new.initialize_game(choose_dog, choose_rate, money)