インクリボンとタイプライター

セーブがしたいんです…

ruby silver 勉強記録 (4日目)

 

・学習内容

 

1、find_allとselect

 配列の検索。

enum.find_all {|item| block }
enum.select {|item| block }

find_allメソッドは、条件に合う要素を探して集めます。ブロック引数itemに要素を入れながらブロックを繰り返し、ブロックの戻り値が真になったときの要素を集め、配列にして返します。

selectメソッドは、find_allの別名です。

次の例は、1から30までの整数のうち7で割り切れるものを集めています。

p (1..30).select {|n| n % 7 == 0 }
[7, 14, 21, 28]

ref.xaio.jp

 

2、mapとcollect

array.map {|item| block }

mapメソッドは、要素の数だけ繰り返しブロックを実行し、ブロックの戻り値を集めた配列を作成して返します。collectメソッドの別名です。

numbers = ["68", "65", "6C", "6C", "6F"]
p numbers.map {|item| item.to_i(16) }
[104, 101, 108, 108, 111]

ref.xaio.jp

 

3、zipとfirst

 zip

array.zip(other_array, ...)

zipメソッドは、配列の要素を引数の配列other_arrayの要素と組み合わせ、配列の配列を作成して返します。transposeメソッドで[array,other_array, ...].transposeとしたときと同じく、行と列を入れ替えます。ただし、transposeメソッドと違って足りない要素はnilで埋められ、余分な要素は捨てられます。

arr1 = [1, 2, 3]
arr2 = [4, 5]
arr3 = [6, 7, 8, 9]
p arr1.zip(arr2, arr3)
[[1, 4, 6], [2, 5, 7], [3, nil, 8]]

ref.xaio.jp

 

first

array.first
array.first(num)

firstメソッドは、配列の最初の要素を返します。配列が空のときはnilを返します。

引数numに整数を指定すると、先頭からその数だけ要素を取り出して、配列にして返します。配列が空のときは空の配列を返します。

fruits = ["apple", "orange", "banana", "kiwi"]
p fruits.first
p fruits.first(2)
"apple"
["apple", "orange"]

ref.xaio.jp

 

4、slice

array.slice(index)
array.slice(index, length)
array.slice(range)

sliceメソッドは、[]メソッドの別名です。配列から引数で指定した位置の要素を取り出して返します。
引数の指定のしかたと戻り値については、[]メソッドを参照してください。

animals = ["dog", "cat", "mouse", "rabbit", "horse"]
p animals.slice(3)
p animals.slice(1, 3)
p animals.slice(2..4)
"rabbit"
["cat", "mouse", "rabbit"]
["mouse", "rabbit", "horse"]

ref.xaio.jp

 

5、eql?

array.eql?(other_array)

eql?メソッドは、ハッシュのキーが配列であるときに、「キーとして同じかどうか」を調べるために内部的に使われるメソッドです。

レシーバarrayと引数other_arrayの各要素を順に比較して、それぞれが同じであればtrue、違いがあればfalseを返します。要素の比較には、各要素のeql?メソッドが使われます。

配列の比較には、普通はeql?メソッドを使わずに、「配列の内容が同じかどうか」を調べるには==メソッドを、「同じオブジェクトかどうか」を調べるにはequal?メソッドを使ってください。

array = [1, 2, 3]
puts array == [1.0, 2.0, 3.0]
puts array.eql?([1.0, 2.0, 3.0])
true
false

ref.xaio.jp

 

6、equal?

obj.equal?(other_obj)

equal?メソッドは、レシーバobjと引数other_objが同じオブジェクトならtrue、別のオブジェクトならfalseを返します。

Ruby 1.9 Ruby 1.9では、Objectクラスのequal?メソッドはBasicObjectクラスに移されました(この変更は、Ruby 1.8用に書いたプログラムには特に影響はありません)。

Objectクラスでは==equal?は同じメソッドの別名です。しかし、==と違ってequal?メソッドはサブクラスで上書きされず、常にオブジェクトの同一性を調べるのに使われます。自作のクラスでもequal?を上書きしないでください。

次の例では、文字列を==equal?で比較しています。Stringクラスの==は、文字列の内容が同じであればtrueを返します。equal?で比較すると、同じ内容でもオブジェクトが別ならfalseになります。

str1 = "hello"
str2 = "hello"
puts str1 == str2
puts str1.equal?(str2)
true
false

ref.xaio.jp