我认为我的问题非常简单,但我并没有在基本面上闪现。
我有一个类,我想从循环中存储数据并访问循环外的那些类对象。 例如,我想要下面的代码
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
我问,因为我想将此技术应用于更复杂的问题,请提前感谢您提供任何帮助。
答案 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
value
由Number
类定义,因此可用于该类的实例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