0

我有一个以下数组

Bot = Struct.new(:name, :age)

bots = %w(foo bar baz).map do |name|
  Bot.new(name, rand(10))
end

p bots
[ #<struct Bot name="foo", age=3>, 
  #<struct Bot name="bar", age=8>, 
  #<struct Bot name="baz", age=0> ]

我想从属性转换的bots地方获取一个新数组,但我不想更改数组中的真实对象。我怎样才能做到这一点?ageto_sbots

4

2 回答 2

1
Bot = Struct.new(:name, :age)

bots = %w(foo bar baz).map do |name|
  Bot.new(name, rand(10))
end
#=> [#<struct Bot name="foo", age=4>,
#    #<struct Bot name="bar", age=5>,
#    #<struct Bot name="baz", age=8>]

bots.map { |bot| Bot.new(bot.name, bot.age.to_s)}
#=> [#<struct Bot name="foo", age="4">,
#    #<struct Bot name="bar", age="5">,
#    #<struct Bot name="baz", age="8">]
于 2012-11-09T01:22:20.207 回答
1

这将保留机器人:

new_bots = bots.map {|bot| Bot.new(bot.name, bot.age.to_s) }

不会保留机器人:

new_bots = bots.map! {|bot| Bot.new(bot.name, bot.age.to_s) }

地图!修改它被调用的对象,就像大多数以 ! 结尾的方法一样。它是地图的可变版本。

map 不会修改调用它的对象的内容。大多数数组方法都是不可变的,除了那些以 ! (但这只是一个约定,所以要小心)。

于 2012-11-09T01:23:36.627 回答