ぞえの技術めも

Ruby on Rails勉強中

【24日目】【1日20分のRailsチュートリアル】ハッシュとシンボルの学習

Ruby on Railsチュートリアル(第3版)

久々のRailsチュートリアル。今日は「4.3.3 ハッシュとシンボル」から。

4.3.3 ハッシュとシンボル

ハッシュとはkeyを設定できる配列、って感じ。
意味のある配列を作るときにはハッシュを使った方が自分自身も混乱しなさそう。

>> user = {}                          # {}は空のハッシュ
=> {}
>> user["first_name"] = "Michael"     # キーが "first_name" で値が "Michael"
=> "Michael"
>> user["last_name"] = "Hartl"        # キーが "last_name" で値が "Hartl"
=> "Hartl"
>> user["first_name"]                 # 要素へのアクセスは配列の場合と似ている
=> "Michael"
>> user                               # ハッシュのリテラル表記
=> {"last_name"=>"Hartl", "first_name"=>"Michael"}

ここはコードだけ読んでもなんとなく分かる。

>> user = { "first_name" => "Michael", "last_name" => "Hartl" }
=> {"first_name"=>"Michael", "last_name"=>"Hartl"}

ここではRubyのスタイルの慣習に従い、ハッシュの最初と最後に空白を追加しています。この空白は機能上はあってもなくてもよく、コンソールでは無視されます (なぜスペースを置くようになったのかはわかりませんが、おそらく初期の有力なRubyプログラマの好みが反映されたのでしょう)。

ハッシュの最初と最後は空白ありが慣習なのか…。
個人的な好みは空白なしなので忘れそう。。。

ここまではハッシュのキーに文字列を使用していましたが、Railsのハッシュキーでは文字列よりもシンボルの方が広く使用されています。シンボルは文字列と似ていますが、クォートで囲む代わりにコロンが前に置かれている点が異なります。

ほぅ。

>> user = { :name => "Michael Hartl", :email => "michael@example.com" }
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}
>> user[:name]              # :name に対応する値を取得する
=> "Michael Hartl"
>> user[:password]          # 定義されていないキーの値にアクセスする
=> nil

なんかシンボル→データベースにおけるカラムの名前、みたいな印象受けた。

{ name: "Michael Hartl", email: "michael@example.com" }

Ruby1.9からこんな書き方もできるそう。
自分で書くなら文字数少ないしこっち使うけど:name =>も読めるようにはしておかないと。。

>> params = {}        # 'params' というハッシュを定義する ('parameters' の略)。
=> {}
>> params[:user] = { name: "Michael Hartl", email: "mhartl@example.com" }
=> {:name=>"Michael Hartl", :email=>"mhartl@example.com"}
>> params
=> {:user=>{:name=>"Michael Hartl", :email=>"mhartl@example.com"}}
>>  params[:user][:email]
=> "mhartl@example.com"

データベースじゃ駄目?って思うけどデータベース使うほどでもない値を定義するときに使うのかな…。
使い所は追々でいいか。

ハッシュではeachメソッドも使えるそう。
この辺はコード見たことあるかも。

最後の例として、便利なinspectメソッドを紹介します。これは要求されたオブジェクトを表現する文字列を返します。

"要求されたオブジェクトを表現する文字列"って分かるような分からないような…。
オブジェクトを返すわけではないのかな…?

>> puts (1..5).to_a.inspect    # 配列のリテラルを出力
[1, 2, 3, 4, 5]
>> puts :name, :name.inspect
name
:name
>> puts "It worked!", "It worked!".inspect
It worked!
"It worked!"

p関数とやらもあるらしいけど慣れないうちは使わないようにしよう。

>> p :name             # 'puts :name.inspect' と同じ
:name

今日の作業時間は【24分】
文章を読むだけだと全然Rubyに慣れないなぁ。早く作りたい。

次は「4.3.4 CSS、再び」から。