【9日目:ハッシュを理解しよう!】改訂3版基礎Ruby on Railsを読んだで!

シェアする

  • このエントリーをはてなブックマークに追加
41AkxXsz+5L._SX258_BO1,204,203,200_

8日目からの続きやで

ハッシュ

ハッシュ(連想配列)もオブジェクトの集まりを取り扱うオブジェクトで、
Hashクラスのオブジェクト。

ハッシュと配列の違いは値を入れたり取り出したりするときに、番号の代わりにキー(名前)を使うこと。ハッシュの要素はキーと値のペアからなる。

ハッシュを作成するには「{}」の間に「キー => 値」をカンマで区切って並べる。

例:キーを国名の文字列、値を人口としたハッシュを作成する。
例ではキーと値のセットごとに改行しているが改行しなくても大丈夫

population = {
  "France" => 65027000,
  "Germany" => 81768000,
  "Italy" => 60705591
 }
 puts population["Italy"] # "Italy"の値
population["Japan"] = 127760000 # 要素を新しく追加
puts population["Japan"] # 追加した値を出力

ハッシュのキーがシンボルのときは、「:キー = 値」の代わりに、「キー: 値」の形で並べる。

population = { fr: 65027000, de: 81768000, it: 60705991 }
puts population[:it] # シンボルだけ書くときは「:キー」の並び

ハッシュの要素(キーと値)を順に取り出すには、eachメソッドを使う。

キーと値の2つがeachメソッドのブロックパラメータにはいる。
※ブロックパラメータは、下記例でいう|line|とか、||で挟んでるやつ

例:タブ区切りのファイルを読み込んでデータをハッシュに取り込むもの

books = {}
File.open("books.txt", encoding: "utf-8") do |f|
  f.each_line do |line|
    cols = line.chomp.split(/\t/)
    books[cols[0]] = cols[1]
  end
end

books.each do |key, val|
  puts "#{key}、#{val}円"
end

=begin
books.txtのファイルに記述
坊ちゃん    300
こころ 380
明暗  700
=end

タブ区切りを勉強した。※と言ってもただtabキー押しただけ。
タブはテキストエディタに依存してるから、違いが出た。

↑の例で使っている「each_line」はFileクラスのメソッドで、
ファイルの内容を1行ずつ読み込み文字列を返す。

splitメソッドはStringクラスのメソッドで、
文字列を区切り文字(正規表現)で分割して配列を返します。

ハッシュとメソッドの引数

ハッシュがメソッドの引数になる時の注意点

次の例でのtriangleメソッドはハッシュを引数にしています。こうしたメソッドでは、

「base: 2.3,height: 3.4」のように順番を逆にしても同じ結果になる。

def triangle(params)
  params[:base] * params[:height] / 2.0
end
area = triangle(height: 3.4, base: 2.3)
puts "三角形の面積:#{area}"

ハッシュを引数にしたメソッドの呼び出しの例

triangle( {height: 3.4, base: 2.3}) # これが全部書いている文
triangle(height: 3.4, base: 2.3) # ハッシュを引数の最後に指定するときは{}を省略できる。
triangle height: 3.4, base: 2.3 # Rubyではメソッドの呼び出しの()を省略できる。

Railsではハッシュの引数を持つメソッドがたくさんある。
link_toメソッドや、whereメソッドなど。

そうしたメソッドを呼び出すときは括弧を省略することがよくある。

省略によって直感的でシンプルなコードがかける。
※わかりにくいときは気にせず()をつけよう。

範囲

範囲は、配列やハッシュと同じで集まりを表すオブジェクト。
Rangeクラスを使う。
範囲をつくるには、最初の要素と最後の要素をピリオド2つでつなげる。

例:1から10までの整数を表す。

range = 1..10

最後の要素を含めない時はピリオド3つを使う。

例:1から9までの整数を表す。

range = 1...10

文字列を使うことも可能。

例:aからhまでのアルファベット1文字を表す

range = "a"..h"

eachメソッドを使えば範囲の中の要素を順に取り出せる。

例:7の段の掛け算を4つだけ表示

(1..4).each { |num| puts "7 x #{num} = #{7 * num}"}

numはブロックで指定したやつやで

今日はここまでにしとくか。

本記事は下記本の勉強記事です。初学者にとても良い本です。

スポンサーリンク
Sponsored Link
Sponsored Link

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
Sponsored Link