Ruby技術者認定試験Silver 2.1 学習用の個人的なメモ　その６

# メソッド掘り下げ
破壊メソッドや同じような挙動をする似たようなメソッドについては覚えておく必要あり

破壊メソッドについては!がつかないものをピックアップ

参考にさせて頂いたサイト
http://bakunyo.hatenablog.com/entry/2013/07/11/Ruby認定技術者のSilverに受かったので諸々の報告

## Enumerableモジュール(Array、Hashからincludeされている)
参考(公式のリファレンスにリンク変更)
~~http://ref.xaio.jp/ruby/classes/enumerable~~
http://docs.ruby-lang.org/ja/2.1.0/class/Enumerable.html


| メソッド名 | 意味 | 破壊 | near
|:---------:|----|:----:|:----:|
| all? | 全て真であるかを確認する | × | -
| none? | 全て偽であるかを確認する | × | -
| one? | １つだけが真であるかを確認する | × | -
| any? | いずれかが真であるかを確認する | × | -
| chunk | ブロックの戻り値ごとに要素の並びをまとめた配列を作る | x | -
| collect | ブロックの戻り値で集めた配列を返す | × | map
| collect_concat | 各要素をブロックに渡し、その返り値を連結した配列を返し | × | flat_map
| count | 要素の数を返す | × | size, length|
| cycle | 配列の要素の数だけブロックを繰り返し実行 | × |
| detect | ブロックが真が返したときは繰り返しを中断してその要素を返す | × | find
| drop | 引数のn個の要素を先頭から取り除き、残りで新しい配列を作成して返す | × | -
| drop_while | ブロックの戻り値が真である要素を先頭から取り除き、残りの要素で作成した配列を返す | × | -
| each_cons | 引数nで指定した数の要素を繰り返し取り出して、順次ブロックを実行 | × | each_slice
| each_slice | 引数nで指定した数の要素を繰り返し切り出して、ブロックを実行 | × | each_cons
| each_entry | ブロックを各要素に一度ずつ適用 | × | -
| each_witch_index | 要素の数だけブロックを繰り返し実行 | × | 
| each_with_object | 要素を使ってオブジェクトを操作する事が可能 | × | inject,reduce
| entries | レシーバの各要素を集めて配列にして返す　| × | to_a
| find | ブロックが真を返したときは繰り返しを中断してその要素を返す | × | detect
| find_all | ブロックの条件で真となった戻り値を集め配列を返す(中断しない) | × | select
| find_index | 要素の中から引数objと同じものを探し、その位置を整数で返します | × | 
| first | 最初の要素を取得する | × |
| grep | その結果が真だった要素を集めて配列にして返し | × |
| group_by | ブロックの戻り値が同じ要素をそれぞれ集めます | × |
| partition | ブロックの戻り値（真偽）で要素を2つの配列に分ける | × | 
| reduce | ブロックを使って繰り返し計算を行う | × | inject
| reject | 条件に合わない要素を探して集める | × |
| select | ブロックの条件で真となった戻り値を集め配列を返す(中断しない) | × | find_all
| sort_by | ブロックの戻り値を集めて小さい順に並べる | × |
| take | dropの逆firstの個数指定 | × |
| zip | レシーバと引数のオブジェクトの要素を組み合わせ、配列の配列を生成 | × |



## String
参考
~~http://ref.xaio.jp/ruby/classes/string~~
http://docs.ruby-lang.org/ja/2.1.0/class/String.html

| メソッド名 | 意味 | 破壊 | near
|:---------:|----|:----:|:----:|
| << | 文字列の追加 |○|concat
| concat | 文字列の追加 |○|<<
|［］= | []内で指定した部分文字列を右辺の文字列で置き換え |○|-
| replace | 文字列を変更する |○|-
| insert | 指定の位置に文字列を挿入 |○|-

※stringにはupdateというメソッドはない！

## Array
参考
~~http://ref.xaio.jp/ruby/classes/array~~
http://docs.ruby-lang.org/ja/2.1.0/class/Array.html


| メソッド名 | 意味 | 破壊 | near |
|:---------:|----|:----:|:-----:|
| << | 末尾に要素を追加|○|push|
| concat | 末尾に配列を結合|○|-|
| []= | 指定の位置や範囲の要素を置換|○|-|
| replace | 配列の内容を引数other_arrayのもので置き換え|○|-|
| insert | 指定した位置に要素を挿入|○|-|
| shift | 先頭の要素を取り除いて返す|○|first|
| unshift | 先頭に要素を追加|○|-|
| pop | 末尾の要素を取り除いて返す|○|last|
| push | 末尾に要素を追加|○|<<|
| fill | 指定した値で配列を満たす|○|-|
| delete_at | 指定した位置の要素を削除|○|slice!|
| delete_if | ブロックが真を返す要素を削除。条件に一致したら消える |○|reject!|
| keep_if | ブロックが偽を返す要素を削除。条件に一致したもののみ残す |○|select!|
| delete |要素を削除 |○|-|
| clear | 要素を全て削除 |○|-|
| assoc | キーを元に配列の配列から配列を取り出す |×|-
| rassoc | キーの値を元に配列の配列から配列を取り出す |×|-
| at | 指定の位置の要素を取り出す | × | [], fetch
| choice/sample | 配列の要素を1つランダムに返す | × | -
| select | ブロックの条件で真となった戻り値を集め配列を返す | × | find_all
| combination | 配列から引数n個の要素を選んだときの組合せを返す | × |
| compact | 要素からnilを削除する | × |



## Hash
参考
http://docs.ruby-lang.org/ja/2.1.0/class/Hash.html

| メソッド名 | 意味 | 破壊 | near |
|:---------:|----|:----:|:-----:|
| []= | 指定の位置や範囲の要素を置換|○|-|
| delete_if | ブロックが偽を返す要素を削除 |○|reject!|
| delete |要素を削除 |○|-|
| replace | 配列の内容を引数other_arrayのもので置き換え|○|-|
| shift | 先頭の要素を取り除いて返す|○|first|
| clear | 要素を全て削除 |○|-|
| update | 指定した要素で統合 |○|merge!|


## 模擬試験
http://www.ruby.or.jp/ja/certification/examination/index.data/exam_prep_jp.pdf

| 番号 |解答 | 正解 | 番号 |解答 | 正解 | 番号 |解答 | 正解 |
|-----|-----|-----|------|----|-----|-----|-----|-----|
| 1   |C,D  | ○   | 11   |A   |  ○  | 21  |A    | ○
| 2   |B    | ○   | 12   |A,C |  ○  | 22  |~~A~~    | B
| 3   |D    | ○   | 13   |B   |  ○  | 23  |A    | ○
| 4   |B    | ○   | 14   |~~B~~   |  A  | 24  |~~D~~    | B
| 5   |A,B,E| ○   | 15   |B   |  ○  | 25  |~~?~~    | D
| 6   |B    | ○   | 16   |C   |  ○  | 26  |~~A~~    | C
| 7   |C    | ○   | 17   |D   |  ○  | 27  |~~B,C~~  | C,D
| 8   |B,C  | ○   | 18   |A,C |  ○  | 28  |D    | ○
| 9   |~~B~~    | D   | 19   |B   |  ○  | 29  |A    | ○
| 10  |A,C  | ○   | 20   |~~C~~   |  D  | 30  |~~A~~    | C


```9.rb
puts "Ruby on Rails".delete("Rails")
uby on 
```

```14.rb
str = "RubyAssociation\r\n"
p str
p str.chop

"RubyAssociation\r\n"
"RubyAssociation"
```

```20.rb
p File.join("ruby", "exam","silver")

"ruby/exam/silver"
```

```22.rb
#ケアレスミス
string = "test code"
string.slice(0,4)
p string #引っ掛け 破壊的ではないので

"test code"
```

```24.rb
#Hash系
cc = {"nz"=>"New Zealand", "ru"=>"Russia", "ar"=>"Argentina"}
p cc.has_key?('nz')
p cc.key?('nz')
p cc.include?('nz')
p cc.member?('nz')
p cc.value?("New Zealand") # 値が含まれるか？
p cc.has_value?("New Zealand") # 値が含まれるか？
p cc.contain?('nz') # 存在しないメソッド

true
true
true
true
true
true
hairetu.rb:163:in `<main>': undefined method `contain?' for {"nz"=>"New Zealand", "ru"=>"Russia", "ar"=>"Argentina"}:Hash (NoMethodError)
```

```25.rb
#模擬問題のPDF印字不備
p "Hello there".class
p String.superclass
class Foo; end
class Bar < Foo; end
p Foo.superclass
p Bar.superclass

String
Object
Object
Foo
```

```26.rb
#正規表現
s = "To be or not to be, that is the question."
hash = Hash.new(0)
p s.scan(/\w+/)
s.scan(/\w+/) { |i| hash[i] += 1}
p hash["be"] #=>2
p "-----------------------------"
s = "To be or not to be, that is the question."
hash = Hash.new(0)
p s.match(/\w+/)
s.match(/\w+/) { |i| hash[i] += 1}
p hash["be"] #=>2

["To", "be", "or", "not", "to", "be", "that", "is", "the", "question"]
2
"-----------------------------"
#<MatchData "To">
0
```

```27.rb
#組み込みライブラリ、Integer#chr（encoding)についての説明として正しいものはど
#れか、2つ選択してください。
C.引数で与えられたencodingにおいて、selfを文字コードと見なし、それに対応する一文字か らなる文字列を返す。
D.指定されたエンコーディングでselfを正しく解釈できない場合はエラーが発生する。
```

```30.rb
p 6/2*2
p 6/2**2
p (3*2)**2
p 3*2**2   # 括弧がない場合**が優先される
p "foo" * 2 **2 # "foo" * 4 の意味

6
1
36
12
"foofoofoofoo"
```