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 に答える