社会不適合破壊的お味噌マン

くまのプーさんのような大人になりたいです!

Rubyのモジュールについて

モジュールとは

モジュールとはクラスと同じくメソッドを定義することができるが、大きな違いはモジュールはオブジェクトを作成できない。主な利用方法は他のクラスの中にモジュールをインクルードして利用すること。

参考元:モジュールの定義 - モジュール - Ruby入門

Enumerable

Enumerableモジュールについて

Enumerableモジュールは、配列やハッシュなど集合を表すクラスに数え上げや検索などのメソッドを提供します。

インクルードされているクラス

・Array

・Hash

・Range

・Enumerator (列挙)

・Dir(ディレクトリ)

・Struct(構造体)

・IO(入出力)

よく使うメソッド

dropメソッド

dropメソッドは、引数のn個の要素を先頭から取り除き、残りの要素を新しい配列にして返す。

#配列の場合
"RubyRuby".split("").drop(2) 
=> ["b", "y", "R", "u", "b", "y"]

#ハッシュの場合
hash = {name: "keioka", password:"aaaa", mail:"keioka0828@gmail.com"} 
=> {:name=>"keioka", :password=>"aaaa", :mail=>"keioka0828@gmail.com"}

hash.drop(2)
 => [[:mail, "keioka0828@gmail.com"]] 

#rangeの場合
(1..10).drop(2)
 => [3, 4, 5, 6, 7, 8, 9, 10] 
drop_while
#配列の場合
"RubyRuby".split("").drop(2) 
=> ["b", "y", "R", "u", "b", "y"]

#ハッシュの場合
hash = {name: "keioka", password:"aaaa", mail:"keioka0828@gmail.com"} 
=> {:name=>"keioka", :password=>"aaaa", :mail=>"keioka0828@gmail.com"}

hash.drop(2)
 => [[:mail, "keioka0828@gmail.com"]] 

#rangeの場合
(1..10).drop(2)
 => [3, 4, 5, 6, 7, 8, 9, 10] 
all?

all?メソッドは、ブロック引数itemに要素を入れながらブロックを繰り返し実行し、ブロックの戻り値がすべて真であった場合にtrueを返します。ブロックが偽を返したときは、繰り返しを中断してfalseを返します。

words1 = ["dog", "cat", "mouse", "pig"]
puts words1.all? {|w| w.kind_of?(String) }
each_cons
#Rangeの場合
p (1..5).enum_cons(3).to_a
=>[[1, 2, 3], [2, 3, 4], [3, 4, 5]]

#Hashの場合
hash.each_cons(2).to_a
 => [[[:name, "keioka"], [:password, "aaaa"]], [[:password, "aaaa"], [:mail, "keioka0828@gmail.com"]]] 
#よくわからないことになったので、たぶん使わない。

#配列の場合
 arr.split(" ").each_cons(2)
 => #<Enumerator: ["Ruby", "Html", "Css", "Python", "Java", "Javascript", "PHP"]:each_cons(2)> 

arr.split(" ").each_cons(2).to_a
 => [["Ruby", "Html"], ["Html", "Css"], ["Css", "Python"], ["Python", "Java"], ["Java", "Javascript"], ["Javascript", "PHP"]] 
grep

grepメソッドは、各要素に対して「引数obj === 要素」を試し、その結果が真だった要素を集めて配列にして返します。

Regexpクラスの===は正規表現のマッチです。引数を正規表現にすると、パターンにマッチする文字列を集められます。次の例は、配列の中から半角アルファベットだけの文字列を集めます。

#配列の場合
arr = ["cat", 123, "#dog", "mouse"]
p arr.grep(String)
=>["cat", "#dog", "mouse"]

arr = ["cat", 123, "#dog", "mouse"]
p arr.grep(/\A[A-Za-z]+\Z/) {|item| item.upcase }
=>["CAT", "MOUSE"]
map

要素の数だけ繰り返しブロックを実行し、ブロックの戻り値を集めた配列を作成して返します。ブロック引数itemには各要素が入ります。ブロックを省略したときは、要素をすべて集めた配列を返します。

#Rangeの場合
 (1..10).map{|n| n * 3}
 => [3, 6, 9, 12, 15, 18, 21, 24, 27, 30] 

#配列の場合
["pink", "bule", "yellow", "black", "white"].map{|word| word.upcase}
=> ["PINK", "BULE", "YELLOW", "BLACK", "WHITE"] 
group_by

group_byメソッドは、要素をグループ分けします。ブロック引数itemに各要素を入れながら、要素の数だけブロックを繰り返し、ブロックの戻り値が同じ要素をそれぞれ集めます。メソッドの戻り値は{ ブロックの戻り値 => [要素, 要素, ...], ... }というハッシュになります。

animals = ["cat", "bat", "bear", "camel", "alpaca"]
p animals.group_by {|item| item[0].chr }

=>{"a"=>["alpaca"], "b"=>["bat", "bear"], "c"=>["cat", "camel"]}
Cycle

Enumerable オブジェクトの各要素を n 回 or 無限回(n=nil)繰り返し ブロックを呼びだします。

#2回繰り返し
["a","b","c"].cycle(2) {|x| puts x }
a
b
c
a
b
c
 => nil 

#nil
["a","b","c"].cycle(0) {|x| puts x }
=>nil

#無限ループ
 ["a", "b", "c"].cycle{|x| puts x}
a
b
c
:
:
: