假设我有两个对象:User和Race。
class User
attr_accessor :first_name
attr_accessor :last_name
end
class Race
attr_accessor :course
attr_accessor :start_time
attr_accessor :end_time
end
现在假设我创建了一个像这样的哈希数组:
user_races = races.map{ |race| {:user => race.user, :race => race} }
如何将user_races转换为结构数组,请记住我希望能够从struct元素访问user和race的属性? (关键是我想通过Struct创建一个新对象,以便我可以访问User和Race的组合属性。例如,UserRace.name,UserRace.start_time。)
答案 0 :(得分:2)
试试这个:
class User
attr_accessor :first_name
attr_accessor :last_name
end
class Race
attr_accessor :course
attr_accessor :start_time
attr_accessor :end_time
end
UserRace = Struct.new(:first_name, :last_name, :course, :start_time, :end_time)
def get_user_race_info
user_races = races.map do |r|
UserRace.new(r.user.first_name, r.user.last_name,
r.course, r.start_time, r.end_time)
end
end
现在让我们测试一下结果:
user_races = get_user_race_info
user_races[0].first_name
user_races[0].end_time
答案 1 :(得分:1)
为UserRace对象创建一个定义(作为Struct),然后只创建一个所述对象的数组。
UserRace = Struct.new(:user, :race)
user_races = races.map { |race| UserRace.new(race.user, race) }
# ...
user_races.each do |user_race|
puts user_race.user
puts user_race.race
end
答案 2 :(得分:1)
如果您的哈希具有如此多的属性,以便将它们全部列出:
user_races = races.map{ |race| {:user => race.user, :race => race, :best_lap_time => 552.33, :total_race_time => 1586.11, :ambient_temperature => 26.3, :winning_position => 2, :number_of_competitors => 8, :price_of_tea_in_china => 0.38 } } # garbage to show a user_race hash with many attributes
变得很麻烦(或者如果您稍后可能会添加更多属性),您可以使用*
(“splat”)运算符。
the splat operator converts an array into an argument list. 所以你可以通过执行以下操作来填充Struct.new的参数列表和哈希中的键列表:
UserRace = Struct.new(*races.first.keys)
当然,这假设数组中的所有哈希都具有相同的键(按相同的顺序)。
一旦定义了结构,就可以使用inject
来构建最终的对象数组。 (inject greatly simplifies converting many objects from one data type to another。)
user_races.inject([]) { |result, user_race| result << UserRace.new(*user_race.values) }
答案 3 :(得分:0)
你有这个:::
user_races = races.map{ |race| {:user => race.user, :race => race} }
现在创建一个Struct,如下所示:
UserRace = Struct.new(:user, :race)
然后::
user_races.each do |user_race|
new_array << UserRace.new(user_race[:user],user_race[:race])
end
没有测试过代码......应该没问题......说什么?
编辑:这里我将UserRace的对象添加到new_array。