当没有变化时,`Array#reject!`返回`nil`的目的是什么?

时间:2013-03-13 02:36:53

标签: ruby arrays

Array#reject!返回nil,以防该块为接收器中的每个元素评估false(在适当的位置改变,并且在这种情况下不会改变),与Array#reject

a=1,2,3
a.reject {false} # => [1, 2, 3]
a.reject! {false} # => nil

这在我看来相当奇怪。为什么Array#reject!被设计为这样做?在这种情况下,Array#reject!的行为应该像Array#reject吗?

我希望能够链接select!reject!map!等方法。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

使用delete_if代替?剩下的东西很好。


reject的作用类似select,它实际上是返回一个新的容器,然后只是指向新的容器,因为你要求!,而delete_if正在这样做,直接

我同意这不自然,但是你可以写下很多事情:

value = a.reject!; if value, do {something} end 

因此,它返回null是有道理的,因为大概如果没有拒绝,就不需要做任何事情。如果您希望改变某些内容,那么您只需使用select!

答案 1 :(得分:0)

我认为reject!设计为在没有进行任何更改时返回nil,因此可以很好地使用它:

candidates.reject! { |c| ... } or puts "Unable to reject any candidates."

由于reject!在没有拒绝时返回nil,因此只有在没有拒绝的情况下才会运行“或”之后的部分。

你也可以做一些像Kasumi的回答。