項目20におけるfetchを利用したコード例の代替案 186 views Post SatoKen @kenicode 14 Nov, 2024 07:00 +00:00 Last edited 14 Nov, 2024 07:07 +00:00 Effective Rubyの「項目20 ハッシュのデフォルト値を利用することを検討しよう」では、 a. ハッシュにエントリが存在しない場合には配列作成してから配列に要素を追加し、 b. ハッシュにエントリが存在する場合にはそのエントリである配列に要素を追加する という動作をするコードとして、fetchを使う以下のようなコードサンプルが提示されている。 hash[key] = hash.fetch(key, []) << value このコードを実際に動かす簡単な例として、自然数を偶数と奇数に分けるコードを以下に示す。 10.times.reduce({}) do |hash, value| key = value.odd? ? :odd : :even hash[key] = hash.fetch(key, []) << value hash end => {:even=>[0, 2, 4, 6, 8], :odd=>[1, 3, 5, 7, 9]} さて、このhash[key] = hash.fetch(key, []) << valueと同じ動作をする別のコードとして、以下の代替案があるのだが、本書では触れられていない。 (hash[key] ||= []) << value こちらのコードの方が、keyが2回登場しないという面でDRY原則的には優れている。 具体的には、2カ所で同じにしないといけないところをうっかり違うものにしてしまうというミスを防ぐことができる。 なお、Rubyの式がオブジェクトを常に返すことを利用したこのような書き方に慣れていないプログラマには、このコードは理解しづらいかもしれず、それがデメリットになるかもしれない。そういうときには、以下のように2行で書くと良いかもしれない。 ary = (hash[key] ||= []) ary << value @wakairo 14 Nov, 2024 10:44 +00:00 (hash[key] ||= []) << value、私は普通に読めて大丈夫なコードですが、一般的にはどうなのでしょうね。 ちなみに私の場合、こちらのコードよりもfetchのコードの方が読むのに時間がかかるかもしれません。というのも、Rubyの公式ドキュメントを読んで、fetchの仕様を確認して、なぜfetchを使ったのかしばし考えて、というように時間をかけてしまいそうだからです。 Write Preview How to write in Markdown
SatoKen @kenicode 14 Nov, 2024 07:00 +00:00 Last edited 14 Nov, 2024 07:07 +00:00 Effective Rubyの「項目20 ハッシュのデフォルト値を利用することを検討しよう」では、 a. ハッシュにエントリが存在しない場合には配列作成してから配列に要素を追加し、 b. ハッシュにエントリが存在する場合にはそのエントリである配列に要素を追加する という動作をするコードとして、fetchを使う以下のようなコードサンプルが提示されている。 hash[key] = hash.fetch(key, []) << value このコードを実際に動かす簡単な例として、自然数を偶数と奇数に分けるコードを以下に示す。 10.times.reduce({}) do |hash, value| key = value.odd? ? :odd : :even hash[key] = hash.fetch(key, []) << value hash end => {:even=>[0, 2, 4, 6, 8], :odd=>[1, 3, 5, 7, 9]} さて、このhash[key] = hash.fetch(key, []) << valueと同じ動作をする別のコードとして、以下の代替案があるのだが、本書では触れられていない。 (hash[key] ||= []) << value こちらのコードの方が、keyが2回登場しないという面でDRY原則的には優れている。 具体的には、2カ所で同じにしないといけないところをうっかり違うものにしてしまうというミスを防ぐことができる。 なお、Rubyの式がオブジェクトを常に返すことを利用したこのような書き方に慣れていないプログラマには、このコードは理解しづらいかもしれず、それがデメリットになるかもしれない。そういうときには、以下のように2行で書くと良いかもしれない。 ary = (hash[key] ||= []) ary << value
@wakairo 14 Nov, 2024 10:44 +00:00 (hash[key] ||= []) << value、私は普通に読めて大丈夫なコードですが、一般的にはどうなのでしょうね。 ちなみに私の場合、こちらのコードよりもfetchのコードの方が読むのに時間がかかるかもしれません。というのも、Rubyの公式ドキュメントを読んで、fetchの仕様を確認して、なぜfetchを使ったのかしばし考えて、というように時間をかけてしまいそうだからです。
Effective Rubyの「項目20 ハッシュのデフォルト値を利用することを検討しよう」では、
a. ハッシュにエントリが存在しない場合には配列作成してから配列に要素を追加し、
b. ハッシュにエントリが存在する場合にはそのエントリである配列に要素を追加する
という動作をするコードとして、
fetch
を使う以下のようなコードサンプルが提示されている。このコードを実際に動かす簡単な例として、自然数を偶数と奇数に分けるコードを以下に示す。
さて、この
hash[key] = hash.fetch(key, []) << value
と同じ動作をする別のコードとして、以下の代替案があるのだが、本書では触れられていない。こちらのコードの方が、
key
が2回登場しないという面でDRY原則的には優れている。 具体的には、2カ所で同じにしないといけないところをうっかり違うものにしてしまうというミスを防ぐことができる。なお、Rubyの式がオブジェクトを常に返すことを利用したこのような書き方に慣れていないプログラマには、このコードは理解しづらいかもしれず、それがデメリットになるかもしれない。そういうときには、以下のように2行で書くと良いかもしれない。
(hash[key] ||= []) << value
、私は普通に読めて大丈夫なコードですが、一般的にはどうなのでしょうね。ちなみに私の場合、こちらのコードよりも
fetch
のコードの方が読むのに時間がかかるかもしれません。というのも、Rubyの公式ドキュメントを読んで、fetch
の仕様を確認して、なぜfetch
を使ったのかしばし考えて、というように時間をかけてしまいそうだからです。