2016-04-22 77 views
-1

我试图让所有的数组方法和Ruby中的枚举变得非常舒服,但我不明白为什么有些不会变异和其他人做。举例来说,有没有之间的差异:Ruby数组突变混淆?

def double(array) 
    array.map {|x| x * 2} 
end 

def double(array) 
    return array.map! {|x| x * 2} 
end 

此外,当我试着打

b.select{|x| x.even?} 

其中b是一个整数数组,它并没有改变,但是

b = b.select{|x| x.even?} OR 
.delete_if 

看起来似乎改变它。

a.each do |word| 
word.capitalize! 
end 

一样

a.map do |word| 
word.capitalize 
end 

回答

2

根据经验,ruby methods that end in ! will mutate the value they are called on的规则和方法,不将返回一个突变副本。

这里见map vs map!capitalize vs capitalize!

文档还要注意的是b = b.select{|x| x.even?}没有变异的名单b下,而是呼吁0​​创建一个全新的列表,并指定该列表b。注意区别:

在此,b是同一个对象,只是改变:

$ irb 
@irb(main):001:0> b = [1,2,3] 
=> [1, 2, 3] 
@irb(main):002:0> b.object_id 
=> 69853754998860 
@irb(main):003:0> b.select!{|x| x.even?} 
=> [2] 
@irb(main):004:0> b.object_id 
=> 69853754998860 

但在此,b现在完全是一个新的对象:

$ irb 
@irb(main):001:0> b = [1,2,3] 
=> [1, 2, 3] 
@irb(main):002:0> b.object_id 
=> 70171913541500 
@irb(main):003:0> b = b.select{|x| x.even?} 
=> [2] 
@irb(main):004:0> b.object_id 
=> 70171913502160 
+0

错字:'capitalze!'应该是“大写!”。另外,这个例子很好,但是可以使得select更加简洁:b。选择(&:偶数?) –

+0

更简洁,是的,但不太清楚; OP对两个类似命名的方法调用之间的区别的性质感到困惑,抛出一个新的概念,比如对它们进行测试的方法不会做任何事情,但会进一步混淆它们。感谢您的错字! – Hamms

1

有之间的差异:

def double(array)array.map {| x | x * 2} end和

def double(array)return array.map! {| X | x * 2} end

是的。第一个返回一个新的数组。第二个修改原始数组,并返回它。

a.each做|字| word.capitalize!结束如同

a.map do | word | word.capitalize结束

否。第一个修改数组中的元素,并返回原始数组。第二个返回一个填充新字符串的新数组。