rurema / doctree

Repository of Japanese Ruby reference manual

Home Page:https://docs.ruby-lang.org/ja/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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_ifselect! の違いは,削除する要素が無かった場合に自身を返すか 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