LoginSignup
2
1

More than 5 years have passed since last update.

rubyハッシュのいろいろ

Posted at

ハッシュとは

・複数の値をキーとバリュー{key: "value"}の形で持つことができる
{fruits: "apple"}の場合キーが:fruitsでバリューが"apple"
・連想配列とも呼ばれる

ハッシュのとり方

test.rb

p = { "key" => "value" }
=> {"key"=>"value"}


p = { :key => "value" }
=> {:key=>"value"}


p = { key: "value"}
=> {:key=>"value"}


p = {key: :value}
=> {:key=>:value}

・『:』はsymbol型、『""』はstring型
・①②はハッシュロケット(=>)を使った記法。古い書き方。基本的には③④が推奨されている。
  =>だと記述量も増え、読みづらいコードになるため。またシンボルの方が実行速度が早い

引数にハッシュを使う場合

test.rb
  def  self.fruits_price (apple: "100", orange: "200")
     p "#{:apple} #{apple}円" 
          p "#{:orange} #{orange}円"
  end

-----------------------------------------------------
#コンソール
#pry(main)> Test.fruits_price
#"apple 100円"
#"orange 200円"
#=> "orange 200円"

{}は省略できる

test.rb
  def self.fruits_price apple: "100", orange: "200"
    p "#{:banana} #{banana}円"
  end

-----------------------------------------------------
#コンソール
#NameError: undefined local variable or method `banana' for #<Class:0x007febae21cf18>

ハッシュに設定していない値を取ろうとするとエラーになる

ハッシュのSymbol型とString型

シンボル(Symbol)とは

・名前という概念を表すオブジェクト
・『:』をつける
・内部では整数で管理され、コード上では文字列のように表現される
・同じ内容のシンボルはかならず同一のオブジェクトになる

ストリング(String)とは

・文字列を表すオブジェクト
・引用符で囲った文字列リテラルを使う
・同じ内容の文字列でも、管理する整数値は異なる

test.rb

#シンボルの場合
a = :hoge
b = :hoge
a.equal?(b)
#=> true
a.object_id 
#=> 13212508
b.object_id 
#=> 13212508

#ストリングの場合
a = "hoge"
b = "hoge"
a.equal?(b)
#=> false
a.object_id
#=> 70325103742880
b.object_id 
#=> 70325061551180

シンボル(Symbol)とストリング(String)の使い分け

・シンボルは何度使っても同一の値であるためメモリを圧迫しない
・名前や住所、メッセージなど文字列自身がデータの場合はストリングを使う
・ハッシュのキー、メソッドに渡すクラス名/メソッド名/変数名/定数名、ステータス名(性別・国籍)など文字列自体がデータではないときにシンボルを使う

ハッシュを結合する

mergeメソッドを使うとハッシュを結合できる

test.rb
hash1 = {fruits: "apple"}
#=> {:fruits=>"apple"}
hash2 = {price: "100"}
#=> {:price=>"100"}
hash3 = hash1.merge(hash2)
#=> {:fruits=>"apple", :price=>"100"}

ただしすでに存在するキー(シンボル・ストリングに関わらず)を使うと、ハッシュの更新として処理される。

test.rb
hash1 = {fruits: "apple", meet: "beef"}
#=> {:fruits=>"apple", :meet=>"beef"}
hash2 = {fruits: "orange"}
#=> {:fruits=>"orange"}
hash3 = hash1.merge(hash2)
#=> {:fruits=>"orange", :meet=>"beef"}
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1