运行以下内容:
print ['1','2','3'].each { |j| j.to_i }
生成输出:
["1", "2", "3"]
我想了解它为什么不生成:
[1,2,3]
谢谢!
答案 0 :(得分:2)
因为.each
返回原始数组。您必须使用.map
['1','2','3'].map(&:to_i)
=> [1, 2, 3]
每个定义:
rb_ary_each(VALUE array)
{
long i;
volatile VALUE ary = array;
RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
for (i=0; i<RARRAY_LEN(ary); i++) {
rb_yield(RARRAY_AREF(ary, i));
}
return ary; # returns original array
}
答案 1 :(得分:1)
在函数完成循环后,在适用对象上调用#each
将返回该对象,这就是您获取原始数组的原因。
如果您希望根据某些规则修改数组中的值,并将结果作为新数组返回,则可以使用#map
:
arr = ['1', '2', '3']
arr.map {|j| j.to_i}
# => [1, 2, 3]
如果您想直接影响原始数组,可以使用#map!
替换上面的数组,这会改变原始数组。
希望这有帮助!
答案 2 :(得分:0)
另一种方式可能是:
print ['1','2','3'].collect(&method(:Integer))
但请注意,如果您要在生产中使用,这会给性能带来不利影响。