簡體   English   中英

如何在Ruby中通過循環創建類的實例?

[英]How do I create an instance of a class from a loop in Ruby?

我正在嘗試從循環中初始化類的實例,並且不確定如何命名該對象,以便在每次迭代時都使用一個新名稱,因此我沒有五個都稱為“ my_animal”的對象/實例?

my_array = ["Fluffy", "Lala", "Jo", "Cersei", "Berlin"]
my_array.each do |e|
    my_animal = Animal.new(e)
end


class Animal
attr_accessor :name
    def initialize (name)
        @name = name
    end


end

您可以這樣做:

my_array = ["Fluffy", "Lala", "Jo", "Cersei", "Berlin", "Jo"]
arr = my_array.each_with_index.with_object([]) do |(e,i),a|
    a << Animal.send(:new, "#{e}#{i}")        
end
  #=> [#<Animal:0x007fe3e4087b20 @name="Fluffy0">,
  #    #<Animal:0x007fe3e4087a80 @name="Lala1">,
  #    #<Animal:0x007fe3e40879e0 @name="Jo2">,
  #    #<Animal:0x007fe3e4087940 @name="Cersei3">,
  #    #<Animal:0x007fe3e4087878 @name="Berlin4">,
  #    #<Animal:0x007fe3e31d5618 @name="Jo5">] 

arr.map(&:name)
  #=> ["Fluffy0", "Lala1", "Jo2", "Cersei3", "Berlin4", "Jo5"] 

或者,以下方式可以傳達其他信息:

my_array = ["Fluffy", "Lala", "Jo", "Cersei", "Lala", "Jo", "Berlin", "Jo"]
arr = my_array.each_with_object([]) do |s,a|
  instance = a.reverse.find { |i| i.name =~ /^#{s}/ }
  if instance
    old_name = instance.name
     prefix, nbr = old_name.split(/(\d+)/)
    new_name = "#{prefix}#{((nbr.to_i)+1).to_s}"
  else 
    new_name = "#{s}0"
  end        
  a << Animal.send(:new, new_name)        
end
  #=> [#<Animal:0x007fe3e402e458 @name="Fluffy0">,
  #    #<Animal:0x007fe3e402e1b0 @name="Lala0">,
  #    #<Animal:0x007fe3e402dc38 @name="Jo0">,
  #    #<Animal:0x007fe3e402d120 @name="Cersei0">,
  #    #<Animal:0x007fe3e402c540 @name="Lala1">,
  #    #<Animal:0x007fe3e4097d68 @name="Jo1">,
  #    #<Animal:0x007fe3e4096d00 @name="Berlin0">,
  #    #<Animal:0x007fe3e4096698 @name="Jo2">] 
arr.map(&:name)
  #=> ["Fluffy0", "Lala0", "Jo0", "Cersei0", "Lala1", "Jo1", "Berlin0", "Jo2"] 

將所有新對象推入數組而不是靜態變量,然后可以通過數字方式訪問它們。

您可以嘗試將它們放my_animals["Lala"] ,然后可以像my_animals["Lala"]一樣訪問它們。

class Animal
  attr_accessor :name
  def initialize (name)
    @name = name
  end
end

my_array = ["Fluffy", "Lala", "Jo", "Cersei", "Berlin"]
my_animals = Hash.new

my_array.each do |e|
  my_animals[e] = Animal.new(e)
end

代碼上發生了什么,在my_animal = Animal.new(e)上創建的每個實例都丟失了。 您必須在某種結構上跟蹤所有它們。 像字典(哈希)或數組。

這可能會有所幫助:

class Animal
    attr_accessor :name

    def initialize (name)
        @name = name
    end
end

my_array = ["Fluffy", "Lala", "Jo", "Cersei", "Berlin"]

my_instances = {}

my_array.each do |e|
    my_animal = Animal.new(e)

    my_instances[e] = my_animal
end

現在,您有了帶有對象的數組名稱(字符串)。 它將類似於:

my_instance = { "Fluffy" => #<Animal:0x0000000280d638 @name="Fluffy">,
                "Lala"   => #<Animal:0x0000000280d5e8 @name="Lala">,
                "Jo"     => #<Animal:0x0000000280d598 @name="Jo">,
                "Cersei" => #<Animal:0x0000000280d548 @name="Cersei">,
                "Berlin" => #<Animal:0x0000000280d4f8 @name="Berlin">
              }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM