使用另一个类Ruby中的对象数组初始化Object

时间:2013-12-24 03:49:31

标签: ruby-on-rails ruby arrays

我在这里创建了一个小型的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并拥有一个动态网站。

再一次,非常感谢。

3 个答案:

答案 0 :(得分:3)

您的问题是在每次迭代时为@stars_array变量分配一个新值。有多种方法可以解决它:

@stars_array = (0..99).map { |i| Star.new('unknown_star',i) }

顺便提一下,有几个设计问题(仅供您注意):

  1. 为什么变量被称为stars_array,而不只是stars

  2. 为什么Star类的实例里面会有一个名为@star的对象?递归? :)似乎@name将是正确且更清晰的属性名称。

  3. 不要错过缩进。


  4. 编辑:关于数据库映射。最常见的方式 - 从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