我在这里创建了一个小型的Ruby类:
class Star
#Star initialization
def initialize(star, number)
@star = star
@number = number
end
end
我正在寻找一个名为太阳系的类,它有100颗星。这就是我所做的,它似乎没有起作用。任何帮助将不胜感激。
require_relative 'star.rb'
class SolarSystem
#Initialize Game
def initialize(partOfSolarSystem)
@partOfSolarSystem = partOfSolarSystem
@stars_array = []
for i in 0..99
stars_array = Star.new('unknown_star',i)
end
end
def show_solar_system
#code here to show all the initialized stars in solar system
end
end
我似乎无法在构造函数中初始化数组。然后我希望能够打印出星形阵列中的所有元素。对此的任何帮助将不胜感激。
另外,为了最终将其移动到具有rails或类似性质的数据库,我是否应该寻求散列这个或者是否可以轻松地将其转换为mySQL或具有一些辅助函数的其他DB?我最终想把它写入rails并拥有一个动态网站。
再一次,非常感谢。
答案 0 :(得分:3)
您的问题是在每次迭代时为@stars_array
变量分配一个新值。有多种方法可以解决它:
@stars_array = (0..99).map { |i| Star.new('unknown_star',i) }
顺便提一下,有几个设计问题(仅供您注意):
为什么变量被称为stars_array
,而不只是stars
?
为什么Star
类的实例里面会有一个名为@star
的对象?递归? :)似乎@name
将是正确且更清晰的属性名称。
不要错过缩进。
编辑:关于数据库映射。最常见的方式 - 从ActiveRecord :: Base继承这两个类,并创建从太阳系到星星的一对多关系。每个班级都有自己的桌子。绝对不做任何努力。
答案 1 :(得分:1)
每次循环时都要分配新对象。修复是附加新对象:
@stars_array << Star.new('unknown_star',i)
或者,如果您更喜欢单词而不是符号:
@stars_array.push(Star.new('unknown_star',i))
或者,更简洁:
100.times {|i| @stars_array << Star.new('unknown_star',i) }
答案 2 :(得分:0)
需要修复一些方法才能使其正常工作。在循环中,您将为数组分配一个新值而不是附加到它。其次,在你的循环中,你使用局部变量stars_array
而不是实例变量@stars_array。
您的初始化方法应如下所示:
def initialize(part_of_solar_system)
@part_of_solar_system = part_of_solar_system
@stars_array = []
for i in 0..99
@stars_array << Star.new('unknown_star', i)
end
end
另外,你可能想要重温一下你的Ruby习语,比如喜欢使用snake_case来表示变量名的camelCase,并避免使用各种循环,例如。
def initialize(part_of_solar_system)
@part_of_solar_system = part_of_solar_system
@stars_array = []
(0..99).each { |i| @stars_array << Star.new('unknown_star', i) }
end