(必ずinjectを使う制約のもとで)Rubyで配列からハッシュへ変換する

【前置き】

某所で勉強させて頂いた為、結果のアウトプットをば。届けこの思い!
IDE無しでテキストにちょちょっと書くだけだとちょっとした事でも時間かかっちゃいますよね?はい

【本題】

配列の値は決まってて、関数のinjectを使いつつハッシュをリターンせよ って命題。
別言語からRubyに触って理解してたけどじゃあ実際にブロック使いましょうとなった時に結構困ったりする、
実際困った、慣れない端末、慣れない言語どうしようどうしましょう。
詳しい値はさておきじゃあガチでするにはどうしましょうかってのを覚え書き。

さくっと試したかったので環境はAWSで、結論から述べる。
https://github.com/lunalice/RubyChallenge/tree/master/ruby_book/lib

arry_to_hash.rb
require "minitest/autorun"

def tohash(array)
    array.each_slice(2).inject({}) {|hash, (key, value)| hash[key]=value;hash}
end

class ArrayToHashTest < Minitest::Test
    def test_array_to_hash
        assert_equal ({:a=>1, :b=>4}), tohash([:a,1,:b,4])
    end
end

メインはclass ArrayToHashTestでハッシュと関数呼び出し結果を比較している。
初期目がちかちかしてわかり辛かったが関数に渡しているのは配列である。(ハッシュじゃないよー

tohashで配列をarrayで受け取り、
each_slice(2)で配列を2個づつブロック化します。
inject({})はブロック内で前回の処理結果を引き継いで渡すというもの、
()内は初期化なので以下になる。

1回目 {}と     :a,1
2回目 {:a=>1}と  :b,4
etc

Rubyは最後に出力した結果を返すという特性の為、return文を書かなくてもよい。
その為、hash[key]=value;hash}を見た時にRuby知識0だとhashで何やってんの?ってなる。実際にはハッシュに値を詰めて次のループに送っているだけ、後は配列増やしたいだけ増やせばいい感じ。試してないけど奇数の場合でも相方がnilになるんじゃないかなぁ、なって欲しい所。あと思い出しながら手打ちしたけどassert_equalのハッシュの指定で()を付けてなくておかしな解釈されてて若干焦りました。エラーログみつつそういやハッシュは何か括らないといけないんだよなぁと知識だけあったので試して解決。ちなみにinject指定がなければ関数呼び出しでなくHash[*配列]で一発で終わりそう。

【最後に】

見ておられないと思いますが、某所の方に届けばいいなぁ。
何かとかゆい所に手が届かない感じの回答ばかりしていた為、凄いもやもやしたのでこれでスッキリ。調べる事と時間があれば何とかなりそうな内容だったので尚更・・・

明日ちょっと私用でscala書いたのでgitcommitするつもり。
JAVA有料化で一個人として書く事はなくなるのかなぁと感じていて、有償化って事はnotオープン系になるのかしら。javascriptが熱かったりscalaだったりpythonだったり・・・やっぱりWEB系の移り変わりの激しさは目を見張るものがある。しかも言語独自のフレームワークも合わさり最強に見える。ひろーくひろーく行かないとですね。

scalaがJVMで動作するのも相まって有料化の煽り食らいそうな気がしなくもない。外国でお勧めなのがpythonかjavascriptらしい。もともとフロントエンド専用機だったjavascriptがライブラリーやフレームワークでどこにでも出没し、手軽に始める事が出来て個人的に結構注目してます。
AWSも無料期間あるしでサーバー立ててそこでhtml+cssとか慣れておこう。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.