Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

【前置き】

某所で勉強させて頂いた為、結果のアウトプットをば。届けこの思い!
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とか慣れておこう。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away