rurema / doctree

Repository of Japanese Ruby reference manual
https://docs.ruby-lang.org/ja/
245 stars 315 forks source link

fix: URI.decode_www_formのサンプルコードでrassocがエラーを出していたので修正 #2884

Open iwtn opened 4 months ago

iwtn commented 4 months ago

問題箇所

URI. decode_www_formのサンプルコードで、エラーが出たので修正しました。

具体的には、以下の部分を実行すると

require 'uri'
ary = URI.decode_www_form("a=1&a=2&b=3")
p ary.rassoc('a').last

以下のようなエラーが出ます。

before.rb:3:in `<main>': undefined method `last' for nil (NoMethodError)

  p ary.rassoc('a').last
                   ^^^^^

原因

これは Array#rassoc の動作として、配列の配列に対して要素の配列でインデックス 1 の要素が obj に等しいものを検索し見つかった最初の要素を返すので、'a' に該当する要素が無いために nil が返り、last が呼び出せなくなっています。

https://docs.ruby-lang.org/ja/latest/method/Array/i/rassoc.html

修正内容

インデックス 1 の要素である '2'rassoc の引数に指定し、 last のままだと引数がそのまま返ってしまうので、インデックス0の値が返るように first を呼び出すようにしました。 また、メソッド名が1文字長くなったので、インデントを揃えました。

修正後

以下のように動作します。

require 'uri'
ary = URI.decode_www_form("a=1&a=2&b=3")
p ary.rassoc('2').first
"a"
znz commented 4 months ago

重複したキーに対応する複数の値のうち、最初以外を取り出す例にしたいように見えるので、値からキーを取り出す例になるとうれしくなさそうな気がします。 (例として間違っているのは別の問題なので、待ってみて特に代案がなければとりあえずこのままマージする予定です。)

iwtn commented 4 months ago

重複したキーに対応する複数の値のうち、最初以外を取り出す例にしたいように見えるので、値からキーを取り出す例になるとうれしくなさそうな気がします。

そうですね。確かに。ちょっと考えてみます。