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 に答える