狠狠撸

狠狠撸Share a Scribd company logo
Ruby with Hash
2012/5/24 yoyogi.rb
搁耻产测のハッシュについて
自己紹介

フリーエンジニア

twitter:@nysalor
blog: http://blog.larus.jp/
好きなメソッドはEnumerable#map
前座


記号が色々出てきて混乱するという意見があったの
で
変数名まとめ
変数名まとめ

ローカル変数
変数名まとめ

ローカル変数
a
hoge
under_score
camelCase
ms06
変数名まとめ

ローカル変数
a
hoge
              英数と_のみ
under_score   一文字目は小文字

camelCase
ms06
変数名まとめ
変数名まとめ
変数名まとめ

インスタンス変数
変数名まとめ

インスタンス変数
@a
@hoge
@under_score
@camelCase
@ms06
変数名まとめ

インスタンス変数
@a
@hoge
               @で始まる
@under_score
@camelCase
@ms06
変数名まとめ
変数名まとめ
変数名まとめ

クラス変数
変数名まとめ

クラス変数
@@a
@@hoge
@@under_score
@@camelCase
@@ms06
変数名まとめ

クラス変数
@@a
@@hoge
                @@で始まる
@@under_score   あまり使わない

@@camelCase
@@ms06
変数名まとめ
変数名まとめ
変数名まとめ

定数
変数名まとめ

定数
A
Hoge
Under_score
CamelCase
MS06
変数名まとめ

定数
A
Hoge
              大文字で始まる
Under_score   変更しようとすると警告
              (変更できないわけではない)
CamelCase
MS06
変数名まとめ
ここから本题
ハッシュ?

いわゆる連想配列

Hashクラスで定義

{}でくくる

要素は何でもいい
ハッシュの例


{“?rst” => 1, “second” => 2, “third” => 3}
{?rst:1, second:2, third:3}
{“integer” => 1, “string” => ”text”, :array => [1, 2, 3]}
ハッシュの例


{“?rst” => 1, “second” => 2, “third” => 3}
{?rst:1, second:2, third:3}   Ruby1.9以降


{“integer” => 1, “string” => ”text”, :array => [1, 2, 3]}
ハッシュの作り方
ハッシュの作り方

空のハッシュ
ハッシュの作り方

空のハッシュ


a = {}
a = Hash.new
ハッシュの作り方
ハッシュの作り方

中身の入ったハッシュ
ハッシュの作り方

中身の入ったハッシュ

a = {“?rst” => 1, “second” => 2}
a = Hash.new(1) #=> {}
a = Hash[“?rst”, 1, “second”, 2]
a = Hash[*array]
シンボル
シンボル

シンボルをキーにすることが多い
シンボル

シンボルをキーにすることが多い


{:?rst => 1, :second => 2, :third => 3}
{?rst:1, second:2, third:3}
シンボル?
シンボル?

Rubyの内部実装では、メソッド名や変数名、定数名、クラス名など の`名前'を
整数で管理しています。これは名前を直接文字列として処理するよりも 速度面
で有利だからです。そしてその整数をRubyのコード上で表現したものがシンボ
ルです。

シンボルは、ソース上では文字列のように見え、内部では整数として扱われる、
両者を仲立ちするような存在です。
シンボル?

Rubyの内部実装では、メソッド名や変数名、定数名、クラス名など の`名前'を
整数で管理しています。これは名前を直接文字列として処理するよりも 速度面
で有利だからです。そしてその整数をRubyのコード上で表現したものがシンボ
ルです。

シンボルは、ソース上では文字列のように見え、内部では整数として扱われる、
両者を仲立ちするような存在です。

                        from Rubyリファレンスマニュアル
シンボル?
シンボル?
シンボル?

文字列の前に:を付ける
シンボル?

文字列の前に:を付ける
:a
:hoge
:under_score
:CamelCase
:ms06
シンボル?

文字列の前に:を付ける
:a
:hoge
               読みやすい
:under_score   書き換えられない
               ちょっと速い(かも知れない)
:CamelCase
:ms06
シンボル?
ハッシュの使い方
ハッシュの使い方
 # all versions
 1.9.x only
 a = {:alpha => "a", :bravo => "b", :charlie => "c"}

 # 1.9.x only
 a = {alpha: "a", bravo: "b", charlie: "c"}
要素の取り出し
要素の取り出し
 a = {:alpha => "a", :bravo => "b", :charlie => "c"}
要素の取り出し
     a = {:alpha => "a", :bravo => "b", :charlie => "c"}




a[:alpha] #=> “a”
a.fetch(:bravo) #=> “b”
a.values #=> [“a”, “b”, “c”]
キーの取り出し
キーの取り出し
 a = {:alpha => "a", :bravo => "b", :charlie => "c"}
キーの取り出し
     a = {:alpha => "a", :bravo => "b", :charlie => "c"}




a.keys #=> [:alpha, :bravo, :charlie]
要素とキーの取り出し
要素とキーの取り出し
 a = {:alpha => "a", :bravo => "b", :charlie => "c"}
要素とキーの取り出し
     a = {:alpha => "a", :bravo => "b", :charlie => "c"}




a.?rst #=> [:alpha, “a”]
a.assoc(:bravo) #=> [:bravo, “b”]
a.shift #=> [:alpha, “a”]
a.to_a #=> [[:alpha, “a”], [:bravo, “b”], [:charlie, “c”]]
要素とキーの取り出し
     a = {:alpha => "a", :bravo => "b", :charlie => "c"}




a.?rst #=> [:alpha, “a”]
a.assoc(:bravo) #=> [:bravo, “b”]
a.shift #=> [:alpha, “a”]    要素が削除される

a.to_a #=> [[:alpha, “a”], [:bravo, “b”], [:charlie, “c”]]
要素の追加?更新
要素の追加?更新
 a = {:alpha => "a", :bravo => "b", :charlie => "c"}
要素の追加?更新
     a = {:alpha => "a", :bravo => "b", :charlie => "c"}




a[:delta] = “d”
ハッシュの评価
ハッシュの评価
 a = {:alpha => "a", :bravo => "b", :charlie => "c"}
ハッシュの评価
    a = {:alpha => "a", :bravo => "b", :charlie => "c"}




a.has_key?(:bravo) #=> true
a.empty? #=> false
ハッシュの検索
ハッシュの検索
 a = {:alpha => "a", :bravo => "b", :charlie => "c"}
ハッシュの検索
     a = {:alpha => "a", :bravo => "b", :charlie => "c"}




a.select{|k, v| k == :alpha && v == “a”}
ハッシュのマージ
ハッシュのマージ
 a = {:alpha => "a", :bravo => "b", :charlie => "c"}

 b = {:able => "A", :baker => "B", :charlie => "C"}
ハッシュのマージ
     a = {:alpha => "a", :bravo => "b", :charlie => "c"}

     b = {:able => "A", :baker => "B", :charlie => "C"}

a.merge(b)
a.merge!(b)
a.update(b)
a.merge({:charlie => “C”, :delta => “d”})
a.merge(b){|k, a, b| a + b}
ハッシュのマージ
     a = {:alpha => "a", :bravo => "b", :charlie => "c"}

     b = {:able => "A", :baker => "B", :charlie => "C"}

a.merge(b)
a.merge!(b)      破壊的メソッド


a.update(b)
a.merge({:charlie => “C”, :delta => “d”})
a.merge(b){|k, a, b| a + b}
ハッシュのマージ
     a = {:alpha => "a", :bravo => "b", :charlie => "c"}

     b = {:able => "A", :baker => "B", :charlie => "C"}

a.merge(b)
a.merge!(b)      破壊的メソッド


a.update(b)      破壊的メソッド

a.merge({:charlie => “C”, :delta => “d”})
a.merge(b){|k, a, b| a + b}
イテレーション
イテレーション

a = {:alpha => "a", :bravo => "b", :charlie =>
"c"}

a.each do |k, v|
  p k
  p v
end

a.each_pair do |k, v|
  p k
  p v
end
イテレーション

a = {:alpha => "a", :bravo => "b", :charlie =>
"c"}

a.each do |k, v|
  p k
          ブロック変数
  p v
end

a.each_pair do |k, v|
  p k
  p v
end
イテレーション

a = {:alpha => "a", :bravo => "b", :charlie =>
"c"}

a.each do |k, v|
  p k
          ブロック変数
  p v
end

a.each_pair do |k, v|
  p k
          ブロック変数
  p v
end
イテレーション
イテレーション

a = {:alpha => "a", :bravo => "b", :charlie =>
"c"}

a.each_key do |k|
  p k
  p a[k]
end

a.each_value do |v|
  p v
end
イテレーション

a = {:alpha => "a", :bravo => "b", :charlie =>
"c"}

a.each_key do |k|
  p k
           ブロック変数
  p a[k]
end

a.each_value do |v|
  p v
end
イテレーション

a = {:alpha => "a", :bravo => "b", :charlie =>
"c"}

a.each_key do |k|
  p k
           ブロック変数
  p a[k]
end

a.each_value do |v|
  p v
           ブロック変数
end
応用编
応用编

無名ハッシュを返すメソッド
応用编

無名ハッシュを返すメソッド


def const_hash
  {
    eagle: 15,
    falcon: 16,
    hornet: 18,
  }
end

const_hash[:eagle] #=> 15
応用编

無名ハッシュを返すメソッド


def const_hash       初期設定などに便利
  {
    eagle: 15,
    falcon: 16,
    hornet: 18,
  }
end

const_hash[:eagle] #=> 15
応用编

無名ハッシュを返すメソッド
応用编

無名ハッシュを返すメソッド
応用编

無名ハッシュを返すメソッド




const_hash[:eagle]   = “15E”
const_hash[:eagle]   #=> 15
const_hash[:cobra]   = 17
const_hash[:cobra]   #=> nil
応用编

無名ハッシュを返すメソッド




const_hash[:eagle]   = “15E”
const_hash[:eagle]   #=> 15
const_hash[:cobra]   = 17
const_hash[:cobra]   #=> nil

  呼び出すたびに初期値が返る
応用编
応用编
応用编

引数にハッシュを取るメソッド
応用编

引数にハッシュを取るメソッド

def args_by_hash(params = {})
  options = {:tiger => 88, :panther => 75}.merge!
(params)
  p options
end

args_by_hash(mouse: 128)
#=> {:tiger => 88, :panther => 75, :mouse => 128}

args_by_hash(:tiger => 128, :panther => 88, :long
=> 75)
#=> {:tiger => 128, :panther => 88, :lang => 75}
Let’s Try!
Let’s Try!

ハッシュの値を全てStringにする
Let’s Try!

ハッシュの値を全てStringにする

data = {
        showa: 1926,
        meiji: 1868,
        taisho: 1912,
        heisei: 1989,
  }

# => {:showa => “1926”, :meiji => “1868”,...}
Let’s Try!
Let’s Try!
Let’s Try!

ハッシュの値を全てStringにする
Let’s Try!

ハッシュの値を全てStringにする

data = {
        showa: 1926,
        meiji: 1868,
        taisho: 1912,
        heisei: 1989,
  }
Hash[*data.to_a.map{|x| [x.first, x.last.to_s]}]
# => {:showa => “1926”, :meiji => “1868”,...}
Let’s Try!
Let’s Try!
Let’s Try!

ハッシュを値でソートしてキーを返す
Let’s Try!

ハッシュを値でソートしてキーを返す

data = {
        showa: 1926,
        meiji: 1868,
        taisho: 1912,
        heisei: 1989,
  }

# => [:meiji, :taisho, :showa, :heisei]
Let’s Try!
Let’s Try!
Let’s Try!

ハッシュを値でソートしてキーを返す
Let’s Try!

ハッシュを値でソートしてキーを返す

data = {
        showa: 1926,
        meiji: 1868,
        taisho: 1912,
        heisei: 1989,
  }
data.invert.sort.map{|x| x.last}
# => [:meiji, :taisho, :showa, :heisei]
Let’s Try!
Let’s Try!
Let’s Try!

二つの配列からハッシュを作成する
Let’s Try!

二つの配列からハッシュを作成する

array_a = [:meiji, :taisho, :showa, :heisei]
array_b = [1868, 1912, 1926, 1989]



# => {:meiji => 1868, :taisho => 1912,...}
Let’s Try!
Let’s Try!
Let’s Try!

二つの配列からハッシュを作成する
Let’s Try!

二つの配列からハッシュを作成する

array_a = [:meiji, :taisho, :showa, :heisei]
array_b = [1868, 1912, 1926, 1989]
Hash[*array_a.map{
    |x| [x, array_b[array_a.index(x)]]
  }.flatten]
# => {:meiji => 1868, :taisho => 1912,...}
Let’s Try!
Let’s Try!
Let’s Try!

二つのハッシュをマージして値の大きい方だけを残す
Let’s Try!

二つのハッシュをマージして値の大きい方だけを残す


hash_a = {meiji: 45, taisho: 1926,
 showa: 64, :heisei => 2012}
hash_b = {meiji: 1912, taisho: 15,
 showa: 1989, :heisei => 24}

# => {:meiji => 1912, :taisho => 1926,...}
Let’s Try!
Let’s Try!
Let’s Try!

二つのハッシュをマージして値の大きい方だけを残す
Let’s Try!

二つのハッシュをマージして値の大きい方だけを残す


hash_a = {meiji: 45, taisho: 1926,
 showa: 64, :heisei => 2012}
hash_b = {meiji: 1912, taisho: 15,
 showa: 1989, :heisei => 24}
hash_a.merge(hash_b){|k,a,b| [a,b].sort.last}
# => {:meiji => 1912, :taisho => 1926,...}
Let’s Try!
まとめ


ハッシュはちょっと扱いにくい

配列を返すメソッドが多い

キーはシンボルが無難
质疑応答
质疑応答

if available?
??Question.all.map(&:answer!)
end
ご清聴ありがとうございました

More Related Content

Ruby with Hash

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n