rubyチェリー 4章 - Kei5665/text_output Wiki

to_hexメソッド

10進数を16進数に変換する

to_intsメソッド

16進数を10進数に変換する

配列

要素の追加

添え字を指定して値を代入すると、指定した要素を変更することができる。

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

<<

<<を使うと配列の最後に要素を追加することができる。

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

要素の削除

要素の削除はdelete_atメソッドを使います。

a=[1,2,3]#2番目の要素を削除する(削除した値が戻り値になる)
a.delete_at(1)#=>2
a#=>[1,3]

ブロック

ブロックはメソッドの引数として渡すことができる処理のかたまり。

ブロックの範囲
ex)1
numbers.each do|n|
 sum+=
end

ex)2
a=[1,2,3,1,2,3]#配列から値が奇数の要素を削除する
 a.delete_if do|n|
 n.odd?
end a #=>[2,2]

delete_if

delete_ifメソッドはブロックの戻り値をチェックします。その戻り値が真であれば、ブロックに渡した要素を配列から削除します。偽であれば配列に残したままにします。

その他

Rubyでは「要件を問わず共通する処理」はメソッド自身に、「要件によって異なる処理」はブロックにそれぞれ分担させて、1つの処理を完了させるメソッドがたくさん準備されている。

do endの代用

eachなどで使うdo endは{}で代用できる。。改行したくないときに便利。

mapメソッド

mapメソッドは各要素に対してブロックを評価した結果を新しい配列にして返す。

numbers = [1,2,3,4,5]
new_numbers = numbers.map {|n|n*10}
new_numbers #=> [10,20,30,40,50]

空の配列を用意して、ほかの配列をループ処理した結果を空の配列に詰め込んでいくような処理の大半は、mapメソッドに置き換えることができる。

selectメソッド/find_all

ブロックの戻り値が真になった要素だけが集められる

numbers=[1,2,3,4,5,6]
#ブロックの戻り値が真になった要素だけが集められる
even_numbers =
numbers.select do |n|
    n.even?
end

even_numbers#=>[2,4,6]
# 一行バージョン
numbers=[1,2,3,4,5,6]
#ブロックの戻り値が真になった要素だけが集められる
even_numbers=numbers.select{|n|n.even?}
even_numbers#=>[2,4,6]

rejectメソッド

selectメソッドの反対で、ブロックの戻り値が真になった要素を除外した配列を返す

numbers=[1,2,3,4,5,6]
#3の倍数を除外する(3の倍数以外を集める)
non_multiples_of_three=numbers.reject{|n|n%3==0}
non_multiples_of_three#=>[1,2,4,5]

findメソッド/detect

findメソッド(エイリアスメソッドはdetect)はブロックの戻り値が真になった最初の要素を返します。

numbers=[1,2,3,4,5,6]

#ブロックの戻り値が最初に真になった要素を返す
even_number=numbers.find{|n|n.even?}
even_number#=>2

injectメソッド/reduce

injectメソッド(エイリアスメソッドはreduce)はたたみ込み演算を行うメソッド。eachの+=を使った処理をもっと記述を短くできるバージョン

numbers=[1,2,3,4]
sum=0
numbers.each{|n|sum+=n}
sum#=>10

#次の様に書き換えられる 

numbers=[1,2,3,4]
sum=numbers.inject(0){|result,n|result+n}
sum#=>10


&とシンボルを使ってもっと簡潔に書く

#このコードは、
[1,2,3,4,5,6].select{|n|n.odd?}
#=>[1,3,5]
#こう書き換えられる
[1,2,3,4,5,6].select(&:odd?)

範囲オブジェクト

配列や文字列の一部を抜き出す事ができる。

最初の値..最後の値(最後の値を含む) 最初の値...最後の値(最後の値を含まない)

1..5 #=> 1以上5以下
1...5 #=> 1位上5未満

to_aメソッド

範囲オブジェクトに対してto_aメソッドを呼び出すと、値が連続する配列を作成することができます。[]の中に*と範囲オブジェクトを書いても同じように配列を作ることができます(*を使って複数の値を配列に展開することをsplat展開といいます)

(1..5).to_a#=>[1,2,3,4,5]
(1...5).to_a#=>[1,2,3,4]

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

[*1..5]#=>[1,2,3,4,5]
[*1...5]#=>[1,2,3,4]

繰り返し処理

範囲オブジェクトを配列に変換すれば、配列として繰り返し処理を行うことができます。

#範囲オブジェクトを配列に変換してから繰り返し処理を行う
numbers=(1..4).to_a
sum=0
numbers.each{|n|sum+=n}
sum#=>10

配列について

添字

添え字を2つ使うと、添え字の位置と取得する長さを指定することができます。

配列[位置,取得する長さ]

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

.firstメソッド

配列の初めの要素を取得する。引数に最初から数えて取得する個数を入れられる

.last

配列の最後の要素を取得する。引数に最後から数えて取得する個数を入れられる

添字による要素変更

a=[1,2,3,4,5]
#2つめから3要素分を100で置き換える
a[1,3]=100a#=>[1,100,5]

.pushメソッド

.で繋いだ配列に引数で指定した要素を追加する。要素は複数指定できる。

.delete

.で繋いだ配列に引数で指定した要素を削除する。

配列を連結する。

concatメソッドでも連結できるが、それだと元の配列が破壊される。なので基本的には+演算子を使う。

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

a+b#=>[1,2,3]
#aもbも変更されない(非破壊的)
a#=>[1]b#=>[2,3]

splat展開

メソッドの引数に配列を渡すとき、「1つの配列」ではなく、配列を展開して「複数の引数」として渡したい場合は、配列の前に*を置きます

a=[]
b=[2,3]

a.push(1)#=>[1]

#配列を*付きで追加する。(a.push(2,3)と同じ)

a.push(*b)#=>[1,2,3]

メソッドの可変長引数

個数に制限のない引数のことを可変長引数と言います

==で等しい配列かどうか判断する

左辺と右辺の配列が等しいかどうかをチェックできます。

%記法で文字列の配列を簡潔に作る

文字列については%記法の%wまたは%Wを使って作成する方法が用意されています。%記法を使うと、カンマではなく空白文字(スペースや改行)が要素の区切り文字となります。

#[]で文字列の配列を作成する['apple','melon','orange']#=>["apple","melon","orange"]
#%wで文字列の配列を作成する(!で囲む場合)%w!apple melon orange!#=>["apple","melon","orange"]
#%wで文字列の配列を作成する(丸カッコで囲む場合)%w(apple melon orange)#=>["apple","melon","orange"]

Array.new

配列を作成する方法の一つ

#要素が5つの配列を作成する
a=Array.new(5)
a#=>[nil,nil,nil,nil,nil]

ミュータブル、イミュータブル

変更可能がミュータブル。変更不可能がイミュータブル。イミュータブルなクラスは

繰り返し処理での添字の取得

each_with_indexメソッドやwith_indexメソッドを使うと、ブロックの第2引数に添字を渡してくれる。

fruits = ['apple','orange','melon']
fruits.each_with_index do |fruit,i|
    puts "#{i}:#{fruit}"
end
#=>0:apple 1:orange 2:melon

繰り返し処理の引数に複数の要素を渡す時

配列の要素分だけブロック引数を用意すると、各要素の値が別々の変数に格納される

dimensions=[#[縦,横][10,20],[30,40],[50,60],]
#面積の計算結果を格納する配列areas=[]#配列の要素分だけブロック引数を用意すると、各要素の値が別々の変数に格納されるdimensions.eachdo|length,width|areas<<length*widthendareas#=>[200,1200,3000]

ブロックの記述で{}を使うとき

引数をしっかり()で囲む。

メソッドチェーン

変数を使わずにメソッドの戻り値に対して直接ほかのメソッドを呼び出していくコーディングスタイルのこと。ブロックなどにも.でつなげて直接メソッドを使える。 ## break 繰り返し処理を途中で脱出する

throwとcatch

入れ子の構造になっている繰り返し処理の一番外側まで脱出できる

next

ある条件に当てはまる繰り返し処理を飛ばして、次の繰り返し処理に進む。

redo

その回の繰り返し処理をやり直す。