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!
等方法。有没有办法做到这一点?
答案 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的回答。