8日目(2)：Ruby認定試験

#ioクラスメソッド：実行結果を
```
※ファイルdataの内容はabcdefg

File.open("data") do |io|
  while not io.eof?
    print io.read(1)
    io.seek(0,IO::SEEK_SET)
  end
end

#答え
aが表示され続ける
```
CPUが6割、メモリ６GB食われてたので、ちょっと焦りました。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/294402/f22d0180-7515-dcb9-a4a8-7c1759bb0d48.jpeg)

##EOFとは
End of Fileの略
##ioクラスメソッド、SEEK_SET
[参考：instance method IO#seek
](https://docs.ruby-lang.org/ja/latest/method/IO/i/seek.html)
> ファイルポインタを whence の位置から offset だけ移動させます。 offset 位置への移動が成功すれば 0 を返します

ファイル上の文字にポインタなる住所のようで住所じゃないものがある。らしい
今回は、io.seek(0,IO::SEEK_SET)でオフセットを0に指定しているため、
文字の読み込みが最初のaからすすまない（ずっとaが読み込まれる）らしい

#strgtime：実行結果にあう、選択肢を選べ
```
#問題
t = Time.gm(1970,1,1)
puts t.strftime("#ここに代入する式を選択")
#実行結果
1970/01/01
#選択肢
1, %y/%m/%d　　　,2, %Y/%M/%d
3, %y/%M/%d      ,4, %Y/%m/%d

#答え
4
```
##strgtimeメソッド
[instance method Time#strftime](https://docs.ruby-lang.org/ja/latest/method/Time/i/strftime.html)
少しずつ覚えるしかないようだ。
###strgtimeで代表的なもの
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|  4桁の西暦 | 2桁の西暦  | 月  | 日  | 時刻  | 分  | 秒  |
| %Y  | %y| %m  |  %d |  %H | %M  |  %S |

#正規表現：
Newまたはnewのみで構成される行にマッチする正規表現を選びなさい。（二つ選択

```
#選択肢
^[Nn]ew$
^N|new$
^[Nn][e][w]$
^New|new$
^[New]|[new]$

#答え　１と３
```
##正規表現
正規表現もさっぱりなので、授業の無い、土日月に理解したい

#Rubyの予約語：予約語を選べ
```
#問題
while　　　rand
goto　　　class　　　const

#答え　whileとclass
```
##予約語
既にruby側で定義されている言葉。自分で使おうとしても使えない。

#to_s :実行結果をかけ
```
#問題
x = 0
[1,2,3].each do |x|
 print x.to_s + " "
end

puts x

#解答　1  2  3  0
(1，2，3は表示上は数字型だか、実は文字型)
```
##to_s　：整数型データを文字型に変換する

##検証コード
```
x = 0
[1,2,3].each do |x|
  print x.to_s + " "
  print x.to_s.class
end
puts x

#実行結果
irb(main):001:0> x = 0
[=> 0
1irb(main):002:0> [1,2,3].each do |x|
 irb(main):003:1*   print x.to_s + " "
irb(main):004:1>   print x.to_s.class
irb(main):005:1> o_s.class
irb(main):005:1> end
irb(main):005:1> end1 String2 String3 String=> [1, 2, 3]
irb(main):006:0> puts x
0
=> nil
#不思議
```

#Rubyの偽の値
```
#問題
nil　　0　　　""
false　　0.0　　　NULL

#解答　　nil と　　false
```
これも記憶

#例外処理: 適切な選択肢を
```
#問題
y = false
y ##AAA## (raise "failed")
puts("succeeded!")
#選択肢
1, |　　,2, ||   ,3, &    ,4, &&

#答え　　　&&
```
## &&演算子
&&演算子は左辺の評価結果がfalseの場合は、右辺を評価せずに次の処理に進む
|| 演算子は、左辺の評価結果がtrue の場合は、右辺を評価せずに次の処理に進む
|演算子と&演算子は、左辺の評価結果に関係なく、右辺を評価する

## raise 例外
raiseは例外を投げるので、それ以降の処理を飛ばす
それを捕捉したい場合は、begin rescue endを使う

今回の場合、raiseが実行されるとputs("succeeded!")が実行されないのを、考慮

#範囲オブジェクト:1から10まで表示sるコードを選べ
```
(1.10).each do |i| puts i end
(1..10).each do |i| puts i end
(1...10).each do |i| puts i end
(1....10).each do |i| puts i end

#答え　２
```
##範囲オブジェクト
定義されているのは、点２つと点3つ。
２つは２から10以下　、3つは２から10未満

#gsub! :実行するとどうなる
```
#問題
HOGE = "hoge"
HOGE.gsub!("hoge", "piyo")
print HOGE

#答え　　警告は発生せず、「piyo」が表示される。
```
##gsub! :破壊的メソッド
アルファベット大文字で始まる識別子は定数は定数なので、新たに代入を行う際には警告が発生します。
しかし、gsub!は破壊的メソッドを呼び出しているだけなので、警告は発生せず、文字列は「piyo」に書き換わります。

#例外：正しい記述を選べ
```
#問題
1, beginによって例外を捕捉する際は、例外の可能性がある処理をbeginからrescueの間に記述する。
2, ひとつの処理に対して複数のrescueは、指定できない。
3, 例外オブジェクトのメソッドstacktraceにより、例外スタックを取得できる。
4, ensureは、必ず記述する必要がある

#答えは１
```
##stacktraceとは
[参考：](https://wa3.i-3-i.info/word13281.html)
>エラーが発生したときに表示される内容で、そのエラーが発生するまでの過程（どんな処理がどの順番で呼び出されたかの流れ）を、ざっくりと表示したもの

#エラーコード
以下のコードの##AAA##にZeroDivisionError が発生した時の処理を記述したい。適切なコードを選択

```
#問題
begin
  puts 10 / 0 #ZeroDivisionError
  ##AAA##
  print "ZeroDivisionException:", ex.message
end
#選択肢
1, rescue ZeroDivisionError = ex
2, rescue ZeroDivisionError ex
3, rescue ZeroDivisionError -> ex
4, rescue ZeroDivisionError => ex

#答え　3
```
##試してみて
```
begin
  puts "hello"
  puts 10 / 0
  puts "good afternoon"
  puts "good afternoon"
  puts "good afternoon"
  puts "good afternoon"
  puts "good afternoon"
  puts "good afternoon"
  rescue ZeroDivisionError => ex
    puts "good bye"
    print "ZeroDivisionException:", ex.message
end
```
```
begin
  puts "hello"
  puts 10 / 0
  puts "good afternoon"
  puts "good afternoon"
  puts "good afternoon"
  puts "good afternoon"
  puts "good afternoon"
  puts "good afternoon"
  rescue Exception => ex
    puts "good bye1111111"
    print "message:", ex.message
  rescue ZeroDivisionError => ex
    puts "good bye2222222"
    print "ZeroDivisionException:", ex.message
end
```
[参考：Ruby 例外について](https://qiita.com/yukiyoshimura/items/27d72c503b24ac192203)

#?A : コード実行どうなる
```
#問題
p ?A

#答え　"A"
```
##解説コード
```
#コード１　
p "A".ord
#出力
65
#コード２
p 65.chr 
#出力
"A"
```
##65とは
unicode上のAの番号的な
[参考：Ruby にて文字と Unicode コードポイントの相互変換を行う](http://d.hatena.ne.jp/vividcode/20110120/1295542000)


**今回も、なるほど！よくわからん、が多い**