32
2015 6 13 Ruby 初級者向けレッスン 53 — Array Hash — ひがき @ Ruby 関西

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

  • Upload
    higaki

  • View
    45

  • Download
    3

Embed Size (px)

Citation preview

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

2015年6月13日

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

ひがき @ Ruby関西

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

Array と Hash

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

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

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

[1, 1, 2, 3]

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

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

値へのアクセスa = ["a", "b", "c", "d", "e"]

a[0] # => "a"

a[1] # => "b"

a[-1] # => "e"

a[1] = "B"

a[3, 2] # => ["d", "e"]

a[1..-2] # => ["B", "c", "d"]

a[5] # => nil

Page 5: Ruby初級者向けレッスン  53回 ─── 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初級者向けレッスン  53回 ─── Array と Hash

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

Array.new(3){0} # => [0, 0, 0]

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

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

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

簡単な Array 操作a = [1, 1] + [2, 3] # => [1, 1, 2, 3]

a << 5 # => [1, 1, 2, 3, 5]

a << 8 # => [1, 1, 2, 3, 5, 8]

a = a - [3, 1] # => [2, 5, 8]

a = a * 2 # => [2, 5, 8, 2, 5, 8]

a.sort # => [2, 2, 5, 5, 8, 8]

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

String から Array へ"Ruby関西".chars

# => ["R", "u", "b", "y", "関", "西"]

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

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

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

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

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

Array から String へ[1, 1, 2, 3].to_s # => "[1, 1, 2, 3]"

["matz", 50, "dhh", 35].join(’,’)

# => "matz,50,dhh,35"

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

Page 10: Ruby初級者向けレッスン  53回 ─── 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 11: Ruby初級者向けレッスン  53回 ─── Array と Hash

値へのアクセスh = {:AAPL=>566.71, :GOOG=>605.23}

h[:AAPL] # => 566.71

h[:MSFT] = 31.16

h[:FB] # => nil

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

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

sum # => {}

sum[:FB] # => 0

sum[:TWTR] += 1

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

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

簡単な Hash 操作{a: 1, b: 2}.keys # => [:a, :b]

{a: 1, b: 2}.values # => [1, 2]

{a: 1, b: 2}.merge({c: 3})

# => {:a=>1, :b=>2, :c=>3}

{a: 1, b: 2}.merge({a: 0})

# => {:a=>0, :b=>2}

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

Hash から Array へ{matz: 50, dhh: 35}.to_a

# => [[:matz, 50], [:dhh, 35]]

[[:matz, 50], [:dhh, 35]].to_h

# => {:matz=>50, :dhh=>35}

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

Array から Hash へa = [:matz, 50, :dhh, 35]

Hash[*a] # => {:matz=>50, :dhh=>35}

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

繰り返し each["a", "b", "c"].each{|i| puts i}

["a", "b", "c"].each do |i|

puts i

end

# >> a

# >> b

# >> c

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

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

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

Array.ancestors

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

Hash.ancestors

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

Page 18: Ruby初級者向けレッスン  53回 ─── 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 19: Ruby初級者向けレッスン  53回 ─── 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 20: Ruby初級者向けレッスン  53回 ─── Array と Hash

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

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

a[0] = 0

a # => [0, 2, 3]

b # => [0, 2, 3]

Page 21: Ruby初級者向けレッスン  53回 ─── 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初級者向けレッスン  53回 ─── 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初級者向けレッスン  53回 ─── 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初級者向けレッスン  53回 ─── 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 25: Ruby初級者向けレッスン  53回 ─── Array と Hash

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

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

演習問題 1map を使わずに Array のそれぞれの要素を 2倍した新しい Array を作ってみよう。

a = [1, 2, 3, 5]

result = []

a.each do |i|

...

result # => [2, 4, 6, 10]

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

演習問題 2select を使わずに Array から奇数の要素だけを抽出してみよう。

a = [1, 2, 3, 5]

result = []

a.each do |i|

...

result # => [1, 3, 5]

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

演習問題 3inject を使わずに Array の要素を合計してみよう。

a = [1, 2, 3, 5]

result = 0

a.each do |i|

...

result # => 11

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

演習問題 4• Enumerable#map を使ってArray の各要素を

2倍してみよう。• Enumerable#select を使ってArray から奇数の要素だけを抽出してみよう。

• Enumerable#inject を使って Arrayの要素を合計してみよう。

a = [1, 2, 3, 5]

a.map ...

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

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

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

を数えてみよう。

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

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

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

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

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

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

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

learn ruby kansai 67