阵列爆炸方法的行为

art*_*ave 15 ruby arrays

一些爆炸版本Array的方法是像compact!,reject!,flatten!,uniq!回报率nil,如果没有改变:

[1,[2]].flatten!
# => [1, 2]
[1,2].flatten!
# => nil
[1,[2]].flatten
# => [1, 2]
[1,2].flatten
# => [1, 2]

[1,2,nil].compact!
# => [1, 2]
[1,2].compact!
# => nil
[1,2,nil].compact
# => [1, 2]
[1,2].compact
# => [1, 2]
Run Code Online (Sandbox Code Playgroud)

如果他们这样做,就必须有理由.任何想法可能是什么?

Dav*_*tte 18

bang(!)方法会修改当前对象,但nil如果每个文档没有受影响的元素,它们会返回.如果您出于某种原因需要执行某些操作(如果您修改了相关数组),这将非常有用.

if array.flatten!
  puts "Oh yeah... flattened that array!"
end
Run Code Online (Sandbox Code Playgroud)

  • 这迫使我在不需要的地方制作副本.这正是我在第一时间使用撞击版本遇到麻烦的原因. (6认同)
  • 它可能是一个尚未修复的设计缺陷,因为它会破坏代码.我想有人会同意,返回对象本身更重要的是知道它是否发生了变化.Array类甚至不连贯:Array#sort!即使没有进行任何更改,也始终返回对象.另一方面,Python有一个不同的策略:就地操作返回nil(None)来强调它.最后:当你在现场操作后返回一个对象时,最安全和最清楚的可能是一个简单的:1)obj.operation!+ 2)(返回)obj. (4认同)
  • 这是一个好点.但你不能说`return array.flatten!`,对我来说,这看起来也很有用 (2认同)
  • 疑难杂症.是的,你需要`返回array.flatten!|| 数组`(或将它分成两个语句),这不是非常优雅,IMO,但这是我能想到的唯一选择. (2认同)