有没有人能解释一下,为什么我最初的常量LIST从一开始就被操纵了?我认为常量可以只初始化一次。我希望在不影响原始数组(LIST)的情况下,将操作存储在新的数组(new_list)中。
$ned = "foo"
$med = ""
print LIST = [:nrd, :mrd_y] # -> [:nrd, :mrd_y]
list = LIST
new_list = list.delete_if { |element|
case element
when :nrd then $ned.empty?
when :mrd_y then $ned.empty? || $med.empty?
end
}
print new_list # -> [:nrd]
print LIST # -> [:nrd] instead of [:nrd, :mrd_y]发布于 2013-05-19 01:11:52
Array#delete_if->删除块计算为true的self的每个元素。
$ned = "foo"
$med = ""
LIST = [:nrd, :mrd_y]
p LIST.object_id #=> 84053120
list = LIST
p LIST.object_id #=> 84053120
new_list = list.delete_if { |element|
case element
when :nrd then $ned.empty?
when :mrd_y then $ned.empty? || $med.empty?
end
}List和list持有相同的Array对象,object_id如上所述。因此,对于来自块的每个true求值,delete_if都会从84053120引用的对象中删除项。由LIST和list保存。所以你可以使用下面的代码:
$ned = "foo"
$med = ""
LIST = [:nrd, :mrd_y]
list = LIST
new_list = list.dup.delete_if { |element|
case element
when :nrd then $ned.empty?
when :mrd_y then $ned.empty? || $med.empty?
end
}
p new_list #=>[:nrd]
p LIST #=>[:nrd, :mrd_y]或(更好的方法使用
Array#reject),
$ned = "foo"
$med = ""
list = [:nrd, :mrd_y]
new_list = list.reject { |element|
case element
when :nrd then $ned.empty?
when :mrd_y then $ned.empty? || $med.empty?
end
}
p new_list #=>[:nrd]
p list #=>[:nrd, :mrd_y]https://stackoverflow.com/questions/16626876
复制相似问题