Arrayのkeep_ifの説明がわかりにくい
universato opened this issue · comments
機能の説明がわかりにくい
Arrayのkeep_ifの説明の説明で、
ブロックが false を返した要素を削除します。
と書いてあります。(https://docs.ruby-lang.org/ja/latest/method/Array/i/keep_if.html)
しかし、
a = [0, "", true, false, nil]
a.keep_if { |v| v }
p a #=> [0, "", true]
nil
を返した要素も削除していたので、厳密に「ブロックが偽(falsy)を返した要素を削除します」と説明する方が誤解がないと思います。
加えて「真を返した要素を残す」というニュアンスがあった方が、メソッド名に対応していてわかりやすいと思います。
「ブロックが真を返した要素を残し、それ以外の偽を返した要素を削除します」がいいと思います。
select!との違いがわからない
また、
Array#select! と同様に自身を上書きしますが、削除する要素がなかった場合には修正を行いません。
このように書いてありますが、自分には違いがわかりませんでした。
違いがあるのであれば、コードの例示もあると良いと思いました。
「ブロックが真を返した要素を残し、それ以外の偽を返した要素を削除します」
は,「それ以外の」が「偽」ではなく「要素」にかかることと,「偽を返した」と同一内容であることが読み手を若干惑わせる感じがします。
- ブロックが真を返した要素を残し、それ以外の要素を削除します
- ブロックが真を返した要素を残し、偽を返した要素を削除します
のどちらかでいかがでしょうか。
keep_if
と select!
の違いは,削除する要素が無かった場合に自身を返すか nil
を返すかの違いのようですが,この説明では確かに違いが分からないですね。
コメントありがとうございます!
自分的には、指示代名詞がないほうがわかりやすい気がしましたので、後者ですね。
ちなみに、select!
もkeep_if
と同じ文面でしたね。
また、select!
の違い、理解できました。
こちらの方が、説明の修正が必要ですね。
「削除する要素がなく自身が変化しない場合に、keep_if
はレシーバ自身を返し、select!
はnil
を返します。」
a = [0, "", true]
p a.keep_if {|v| v } #=> [0, "", true]
b = [0, "", true]
p b.select! {|v| v } #=> nil