这令我感到困惑:
class Person
attr_accessor :id, :name
def initialize(init)
init.each_pair do |key, val|
instance_variable_set('@' + key.to_s, val)
end
end
end
@adam = Person.new(:id => 1, :name => "Adam")
@eve = Person.new(:id => 2)
@people = [ @adam, @eve, nil ]
print @people
@people.map! do |person|
person ||= Person.new(:id => 3, :name => "Some default")
if person.name.nil?
person.name = "Eve"
end
end
print @people
# outputs
# [#<Person:0x007ff184303900 @id=1, @name="Adam">, #<Person:0x007ff184303770 @id=2>, nil]
# [nil, "Some default", "Some default"]
我想完全填充@people,以便我最终获得以下内容:
[#<Person:0x007ff184303900 @id=1, @name="Adam">, #<Person:0x007ff184303770 @id=2, @name="Eve">, #<Person:0x007ff184301111 @id=3, @name="Some default">]
我做错了什么?
答案 0 :(得分:2)
map
的作用是调用您提供的块,将集合的元素传递给它,并获取块返回的值。如果没有明确的return
关键字,则块的值是最后计算的表达式的值。这将是您示例中的if
表达式。它可以返回nil
或名称。这些值将映射到原始集合。修复很简单:只需确保从块中返回Person
(例如,通过最后评估)。
@people.map! do |person|
person ||= Person.new(:id => 3)
if person.name.nil?
person.name = "Some default"
end
person
end
print @people
# >> [#<Person:0x007fb5f288b288 @id=1, @name="Adam">, #<Person:0x007fb5f288b0f8 @id=2, @name="Some default">, #<Person:0x007fb5f288ae28 @id=3, @name="Some default">]
答案 1 :(得分:1)
.MAP!用.map中返回的任何内容替换每个元素!方法(在本例中为person.name)。添加&#34;返回人员&#34;在.map的末尾!方法。或者做一个.each而不是.map