34
2014 3 29 Ruby 初級者向けレッスン 48 — Array Hash — ひがき @ Ruby 関西

Ruby初級者向けレッスン 48回 ─── Array と Hash

  • Upload
    higaki

  • View
    263

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Ruby初級者向けレッスン 48回 ─── Array と Hash

2014年3月29日

Ruby初級者向けレッスン 48回— Array と Hash —

ひがき @ Ruby関西

Page 2: Ruby初級者向けレッスン 48回 ─── Array と Hash

Array と Hash

• Array とは• Hash とは• Array・Hash オブジェクトの作り方• 繰り返し• オブジェクトのコピー

Page 3: Ruby初級者向けレッスン 48回 ─── Array と Hash

Array とは• 配列クラス• 任意のオブジェクトを持つことができる

[1, 1, 2, 3]

[1, "2nd", [3, "3"], 4.0, :five]

Page 4: Ruby初級者向けレッスン 48回 ─── Array と Hash

Array とは (2)

a = [1, "2nd", [3, "3"], 4.0, :five]

a[0] # => 1

a[1] # => "2nd"

a[1] = :two

a[3, 2] # => [4.0, :five]

a[1..-2] # => [:two, [3, "3"], 4.0]

a[5] # => nil

Page 5: Ruby初級者向けレッスン 48回 ─── Array と Hash

Array オブジェクトの作り方["a", "b", "c"] # => ["a", "b", "c"]

("a".."c").to_a # => ["a", "b", "c"]

[*"a".."c"] # => ["a", "b", "c"]

%w[a b c] # => ["a", "b", "c"]

%i[a b c] # => [:a, :b, :c]

Page 6: Ruby初級者向けレッスン 48回 ─── Array と Hash

Array の初期化Array.new(3){0} # => [0, 0, 0]

Array.new(3){|i| i.to_s}

# => ["0", "1", "2"]

Page 7: Ruby初級者向けレッスン 48回 ─── Array と Hash

String から Array へ"No Ruby, No Life.".scan(/\w+/)

# => ["No", "Ruby", "No", "Life"]

"Ruby 関西".scan(/\p{Word}+/)

# => ["Ruby", "関西"]

"1,1,2,3,5,8".split(/,/)

# => ["1", "1", "2", "3", "5", "8"]

Page 8: Ruby初級者向けレッスン 48回 ─── Array と Hash

Array から String へ["matz", 48, "dhh", 34].join(’,’)

# => "matz,48,dhh,34"

"%s(%d)" % ["matz", 48] # => "matz(48)"

Page 9: Ruby初級者向けレッスン 48回 ─── Array と Hash

Hash とは• 連想配列クラス• 任意のオブジェクトを持つことができる• 任意のオブジェクトをキーにできる

{0 => "one", "2" => 3, [4, "4"] => :five}

{:AAPL=>566.71, :GOOG=>605.23}

{AAPL: 566.71, GOOG: 605.23}

# => {:AAPL=>566.71, :GOOG=>605.23}

Page 10: Ruby初級者向けレッスン 48回 ─── Array と Hash

Hash とは (2)

h = {:AAPL=>566.71, :GOOG=>605.23}

h[:AAPL] # => 566.71

h[:MSFT] = 31.16

h[:FB] # => nil

Page 11: Ruby初級者向けレッスン 48回 ─── Array と Hash

Hash のデフォルト値sum = Hash.new{|h, k| h[k] = 0}

sum[:FB] # => 0

sum[:TWTR] += 1

sum # => {:FB=>0, :TWTR=>1}

Page 12: Ruby初級者向けレッスン 48回 ─── Array と Hash

Hash から Array へ{matz: 48, dhh: 34}.to_a

# => [[:matz, 48], [:dhh, 34]]

[[:matz, 48], [:dhh, 34]].to_h

# => {:matz=>48, :dhh=>34}

Page 13: Ruby初級者向けレッスン 48回 ─── Array と Hash

Array から Hash へa = [:matz, 48, :dhh, 34]

Hash[*a] # => {:matz=>48, :dhh=>34}

Page 14: Ruby初級者向けレッスン 48回 ─── Array と Hash

繰り返し each[0, 1, 2].each{|i| puts i}

[0, 1, 2].each do |i|

puts i

end

# >> 0

# >> 1

# >> 2

Page 15: Ruby初級者向けレッスン 48回 ─── Array と Hash

繰り返し Enumerable• 繰り返しを行なうクラスのための Mix-in

• クラスには each メソッドが必要

Array.ancestors

# => [Array, Enumerable, Object, Kernel, BasicObject]

Hash.ancestors

# => [Hash, Enumerable, Object, Kernel, BasicObject]

Page 16: Ruby初級者向けレッスン 48回 ─── Array と Hash

繰り返し Enumerable (2)

a = [1, 2, 3, 5]

a.map{|i| i * i} # => [1, 4, 9, 25]

a.select{|i| i.odd?} # => [1, 3, 5]

a.inject{|s, i| s + i} # => 11

a.find{|i| i.odd?} # => 1

a.all?{|i| i.even?} # => false

a.any?{|i| i.even?} # => true

Page 17: Ruby初級者向けレッスン 48回 ─── Array と Hash

injecta = [1, 2, 3, 5]

a.inject do |s, i|

s # => 1, 3, 6

i # => 2, 3, 5

s + i # => 3, 6, 11

end

Page 18: Ruby初級者向けレッスン 48回 ─── Array と Hash

Array のコピーa = [1, 2, 3]

b = a # => [1, 2, 3]

a[0] = 0

a # => [0, 2, 3]

b # => [0, 2, 3]

Page 19: Ruby初級者向けレッスン 48回 ─── Array と Hash

Array のコピー (2)

a = [1, 2, 3] a 0 1 2

1 2 3

-

�� ? @@Rb = a

a[0] = 0

Page 20: Ruby初級者向けレッスン 48回 ─── Array と Hash

Array のコピー (2)

a = [1, 2, 3] a 0 1 2

1 2 3

-

�� ? @@Rb = a b �

���

a[0] = 0

Page 21: Ruby初級者向けレッスン 48回 ─── Array と Hash

Array のコピー (2)

a = [1, 2, 3] a 0 1 2

1 2 3

-

? @@Rb = a b �

���

a[0] = 0 0?

Page 22: Ruby初級者向けレッスン 48回 ─── Array と Hash

Array のコピー (3)

a = ["a", "b", "c"]

b = a.clone # => ["a", "b", "c"]

a[0] = "A"

a # => ["A", "b", "c"]

b # => ["a", "b", "c"]

Page 23: Ruby初級者向けレッスン 48回 ─── Array と Hash

Array のコピー (4)

a = ["a", "b", "c"]

b = a.clone # => ["a", "b", "c"]

a[1].upcase!

a # => ["a", "B", "c"]

b # => ["a", "B", "c"]

Page 24: Ruby初級者向けレッスン 48回 ─── Array と Hash

Array のコピー (5)

a = ["a", "b", "c"]

b = a.clone

a[0] = "A"

a[1].upcase!

a 0 1 2

a b c

-

�� ? @@R

Page 25: Ruby初級者向けレッスン 48回 ─── Array と Hash

Array のコピー (5)

a = ["a", "b", "c"]

b = a.clone

a[0] = "A"

a[1].upcase!

a 0 1 2

a b c

-

�� ? @@R

b 0 1 2-@@I 6 ���

Page 26: Ruby初級者向けレッスン 48回 ─── Array と Hash

Array のコピー (5)

a = ["a", "b", "c"]

b = a.clone

a[0] = "A"

a[1].upcase!

a 0 1 2

a b c

-

? @@R

b 0 1 2-@@I 6 ���

A

6

Page 27: Ruby初級者向けレッスン 48回 ─── Array と Hash

Array のコピー (5)

a = ["a", "b", "c"]

b = a.clone

a[0] = "A"

a[1].upcase!

a 0 1 2

a B c

-

? @@R

b 0 1 2-@@I 6 ���

A

6

Page 28: Ruby初級者向けレッスン 48回 ─── Array と Hash

演習問題 0今日のレッスンで分からなかったこと、疑問に思ったことをグループで話し合ってみよう。

Page 29: Ruby初級者向けレッスン 48回 ─── Array と Hash

演習問題 1map を使わずに map と同じ結果を作ってみよう。

a = [1, 2, 3, 5]

# a.map{|i| i * i} # => [1, 4, 9, 25]

result = []

a.each do |i|

Page 30: Ruby初級者向けレッスン 48回 ─── Array と Hash

演習問題 2select を使わずに select と同じ結果を作ってみよう。

a = [1, 2, 3, 5]

# a.select{|i| i.odd?} # => [1, 3, 5]

Page 31: Ruby初級者向けレッスン 48回 ─── Array と Hash

演習問題 3inject を使わずに inject と同じ結果を作ってみよう。

a = [1, 2, 3, 5]

# a.inject{|s, i| s + i} # => 11

Page 32: Ruby初級者向けレッスン 48回 ─── Array と Hash

演習問題 4与えられた文字列から

• 単語の出現回数• 文字の出現回数

を数えてみよう。

Page 33: Ruby初級者向けレッスン 48回 ─── Array と Hash

自己紹介• 名前 (ニックネーム)

• 普段の仕事・研究内容・代表作• Ruby歴・コンピュータ歴• 勉強会に来た目的• などなど

Page 34: Ruby初級者向けレッスン 48回 ─── Array と Hash

参考• 公式サイトhttps://www.ruby-lang.org/

• るりまhttp://docs.ruby-lang.org/ja/

• 解答例https://github.com/higaki/

learn ruby kansai 60