如何在基本Ruby中跟踪自动示例化的未赋值对象?

1aaf6o9v  于 2022-12-22  发布在  Ruby
关注(0)|答案(2)|浏览(129)

我试图建立一个主谋游戏,我希望有我的代码示例自己的对象包含有关的地方和颜色的步骤在通行码。这是这样我就可以改变长度的通行码没有硬编码它。有一种方法来跟踪这些对象,看到我没有亲自分配一个变量?我的程序可以分配示例自己的变量名,如果是的话我该怎么做

#Builder for password objects
class ColorPicks
  attr_reader :color, :place
  def initialize(color, place)
    @color = color
    @place = place
  end
end

# Determines how long the password should be
module StartUp
  def self.how_many
    @how_many
  end
  def HowManyColors 
    p "How long should the computer's code be?"
    @how_many = gets.chomp.to_i
  end 
end

#Instances the password objects from ColorPicks
class Printer
  include StartUp
  @@i = StartUp.how_many
  @@place = 1
  COLORS = {1 => 'red', 2 => 'blue', 3 => 'green'}

  def self.code_maker
    for a in 1..@@i do 

      number_of_colors = COLORS.length
      random_number = rand(number_of_colors)
      ColorPicks.new(COLORS[random_number], @@place)
      @@place += 1
    end
  end
end

PS.抱歉,我是编程新手。

kqlmhetl

kqlmhetl1#

对对象的引用存储在变量中,例如ColorPicks类中的 * 示例变量 * @color。只有示例本身可以直接访问示例变量。其他对象只能通过方法调用间接访问它,例如attr_reader :color创建一个color方法,该方法返回@color所引用的对象。
如果你想存储可变数量的对象,你通常会使用一个 * 集合 *,比如ArrayHashSet,而不是将每个对象赋给一个单独的变量,你可以将对象添加到集合中,然后将集合赋给一个变量,例如:

class CodeGenerator
  COLORS = %w[red green blue]

  attr_reader :code

  def initialize(size)
    @code = Array.new(size) { COLORS.sample }
  end
end

示例用法:

generator = CodeGenerator.new(5)
generator.code
#=> ["blue", "green", "red", "blue", "red"]

generator.code返回的对象是我们在initialize中赋给@code的数组。要访问集合中的单个对象,可以使用Array#[]:(注意Ruby中的数组是从零开始的)

generator.code[0] #=> "blue"
generator.code[1] #=> "green"

在上面的例子中,我使用了纯字符串来保持代码的简单性。然而这个概念适用于所有对象,也就是说,你可以添加ColorPicks的示例来代替字符串。你也不必使用Array.new构造函数来构建数组。从一个空数组开始,然后在循环中一个接一个地添加你的元素是非常好的,例如:

def initialize(size)
  @code = []
  (1..size).each do |i|
    @code << ColorPicks.new(COLORS.sample, i)
  end
end
j2cgzkjk

j2cgzkjk2#

您可以编写下面的一些变体,其中创建的所有示例都保存到类示例变量所持有的数组中。

class ColorPicks
  @instances = []
  class << self
    attr_reader :instances
  end

  attr_reader :color, :place
  def initialize(color, place)
    self.class.instances << self
    @color = color
    @place = place
  end
end

注意,@instances是一个类示例变量,它的getter是在ColorPick的单例类中创建的。
创建一个示例。

stefan = ColorPicks.new("blue", "Bremen")
  #=> <ColorPicks:0x00007fba7bb29958 @color="blue", @place="Bremen">

然后,

stefan.color
  #=> "blue"
stefan.place
  #=> "Bremen"

现在我们可以看到已经创建的ColorPicks示例:

ColorPicks.instances
  #=> [#<ColorPicks:0x00007fba7bb29958 @color="blue", @place="Bremen">]

现在创建第二个示例。

cary = ColorPicks.new("blue", "Victoria")
  #=> #<ColorPicks:0x00007fba7babc7e0 @color="blue", @place="Victoria">

然后,

cary.color
  #=> "violet"
cary.place
  #=> "Victoria"

现在,

ColorPicks.instances
  #=> [#<ColorPicks:0x00007fba7bb29958 @color="blue", @place="Bremen">,
  #    #<ColorPicks:0x00007fba7babc7e0 @color="Violet", @place="Victoria">]

相关问题