ペイの技術MEMO

文系大学生の技術メモ

Ruby 配列,ブロック,範囲

配列

配列の宣言

a = [1,2,3]
a, b = [1,2] 
c, d = [10] #dはnilになる

要素に追加

a[1] = 20

末尾に追加

a << 10

要素の削除

a.delete_at(3)

引数で指定した文字を削除

a.delete(2)

ブロック

Rubyでは一般的に使われるfor文ではなくeachメソッドが使われる

number = [1,2,3,4]
sum = 0
number.each do |n|
  sum += n
end
 # sum=10

条件を指定して値を削除

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

# 戻り値が真になったら削除する
a.delete_if do |n|
  # odd?で奇数判定している
  n.odd?
end
# a = [2,2]

do...endではなく{}で囲める

numbers.each {|n| sum += n }

map

mapではブロックの戻り値で配列が作れる。空の配列を宣言して末尾に追加するなどの代わりに短くかける

numbers = [1,2,3,4,5]
new_numbers = numbers.map {|n| n*2 }

#new_numbers = [2,4,6,8,10]

select

戻り値が真の値だけで配列を作る

numbers = [1,2,3,4,5,6]
event_numbers = numbers.select {|n| n.even? }
# event_numbers = [2,4,6]

reject

戻り値が偽の値だけで配列を作る

numbers = [1,2,3,4,5,6]
non_multiples_of_three = numbers.reject {|n| n%3==0}
# event_numbers = [1,2,4,5]

find

戻り値が真になった最初の要素を返す

numbers = [1,2,3,4,5,6]
event_number = numbers.find { |n| n.even?}
# event_numbers = 2

inject

繰り返し計算する

numbers = [1,2,3,4]
# ループ処理1回目はinjectの引数0がresultに入り、numbersの1がnに入りresult + nの結果1がresultに入る
# ループ処理2回目はresultが上記の結果1、nが2
# その繰り返し
sum = numbers.inject(0) {|result, n| result + n}
# sum = 10

範囲オブジェクト

値の範囲を表す範囲オブジェクト

range = 1..10(1<=10)
range2 = 1...10(1<10)

文字列の範囲を取り出す

a = 'abcdefg'
a[1..3]
# bcd

配列の範囲を取り出す

a = [1,2,3,4,5]
a[1..3]
#2,3,4

配列に直す

a = (1..10).to_a

# 以下のような書き方もある
a [*1..10]

参考

https://www.amazon.co.jp/exec/obidos/ASIN/4774193976/junic05-22/