0

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!. 有没有办法做到这一点?

4

2 回答 2

3

改用delete_if?其余的东西链很好。


reject就像 一样select,它实际上是返回一个新容器,然后只指向新容器,因为您要求!,而delete_if直接就地执行此操作。

我同意这不是自然的,但会发生很多事情,是你写的:

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

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

于 2013-03-13T02:45:04.270 回答
0

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

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

由于reject!在没有拒绝时返回 nil,因此“或”之后的部分仅在没有拒绝时运行。

您也可以做类似 Kasumi 的回答。

于 2013-03-13T04:31:04.913 回答