在循环内创建一个类对象

时间:2017-01-09 06:34:41

标签: ruby class iterator

我认为我的问题非常简单,但我并没有在基本面上闪现。

我有一个类,我想从循环中存储数据并访问循环外的那些类对象。 例如,我想要下面的代码

class Numbers
  attr_accessor :value

end

n = 1

while n < 10
  p = Numbers.new
  p.value = n
  n += 1
  puts p.value
end

但是我想要存储每个类对象并迭代初始循环之外的集合,而不是遍历循环内部生成的每个Number。在我看来,代码看起来像这样,但它显然不是正确的方法。

class Numbers
  attr_accessor :value
end

n = 1

while n < 10
  Numbers.new
  Numbers.value = n
  n += 1
end

Numbers.each do |f|
  puts f.value
end

我问,因为我想将此技术应用于更复杂的问题,请提前感谢您提供任何帮助。

3 个答案:

答案 0 :(得分:4)

试试这个

class Number
  attr_accessor :value
end

numbers = (1..9).map do |n| 
  number = Number.new
  number.value = n
  number
end

这是如何运作的?

  • map是一个循环,用于创建包含每次迭代结果的数组
  • (1..9).map { |n| ... }因此创建了一个包含9个数字对象的数组

我想你是Ruby的新手,所以这里有一些关于类和对象的帮助

  • Number是一个班级
  • number是一个对象
  • Number.new创建一个对象,它是类Number
  • 的一个实例
  • valueNumber类定义,因此可用于该类的实例
  • number.value因此有效
  • Number.value因此无效且没有意义
  • 使用数组存储多个对象

因此,您的文字应该说

&#34;我有一个类,我想从循环中创建它的实例,并在循环外访问这些实例。 [...]但是,我不想迭代在循环内部生成的每个对象,而是希望将每个实例存储在一个数组中,并在初始循环之外迭代数组。&#34;

答案 1 :(得分:1)

重构

由于您的Number值可能不应更改,因此您可以在创建value对象时设置Number

class Number
  attr_reader :value
  def initialize(value)
    @value = value
  end

  def to_s
    @value.to_s
  end
end

numbers = Array.new(10) { |i| Number.new(i) }

puts numbers
# => 
# 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9

范围

如果您想要1到9之间的数字:

numbers = (1..9).map { |i| Number.new(i) }

输入数字

已定义

to_s方法以避免获取:

#<Number:0x00000001363a70>
#<Number:0x00000001363a48>
#<Number:0x00000001363a20>
#<Number:0x000000013639f8>
#<Number:0x000000013639d0>
#<Number:0x000000013639a8>
#<Number:0x00000001363980>
#<Number:0x00000001363958>
#<Number:0x00000001363930>

使用puts

基本算术

对于基本算术,您可以添加此方法:

def +(other)
  self.class.new(value + other.value)
end

Number

现在您可以输入:

puts Number.new(1) + Number.new(2)
#=> 3

答案 2 :(得分:-1)

你可以使用˙classvariable˙forcollector for instances。

class Number
  attr_accessor :value
  @@numbers = []

  def initialize(value = nil)
    @value = value
    @@numbers << self
  end

  def self.each
    @@numbers.each do |inst|
      yield inst
    end
  end
end

然后使用

1.upto(9){|n| Number.new(n)}

Number.each{|inst| puts inst.value}
# => 1
# => 2
# => 3
# => 4
# => 5
# => 6
# => 7
# => 8
# => 9