Rubyアソシエーションビジネスセミナー試験案内講演資料(Ruby技術者認定試験Ruby1.8→Ruby 2.1の変更点まとめ)

[Rubyアソシエーションビジネスセミナー試験案内講演資料(2014/10/8)](http://www.ruby.or.jp/ja/certification/examination/index.data/rubycert.pdf)
内のサンプルコード。
コピペするとコードがずれたりしたのでまとめました。
自分の参照用のメモです。

実行結果が書かれていないコードは実行結果を追記しました。

# Ruby 1.8 → Ruby 2.1 の変更点

* 多言語化
* リテラル
* キーワード引数
* 新しいラムダ式
* Enumerable#lazy 
* Fiber
* Module#prepend 
* Refinements

## 多言語化
```rb
# encoding: utf-8
p "あ".encoding.name 
#=> "UTF-8"

p "あいうえお"[0] 
#=> "あ" 

p ?あ
#=> "あ" 

p ?あ.ord
#=> 12354

p 97.chr
#=> "a" 

p 12354.chr("utf-8") 
#=> "あ"
```

## リテラル
```rb
p({a: 1, b: 2})
#=> {:a=>1, :b=>2}

p 1/2r
#=> (1/2)

p 1i
#=> 0 + 1i
```

## キーワード引数
```rb
def foo(x: 1, y: 2, **z)
  p x #=> 3
  p y #=> 2
  p z #=> {:a=>4, :b=>5}
end
foo(x: 3, a: 4, b: 5)

```

```rb:出力
3
2
{:a=>4, :b=>5}
```


## 新しいラムダ式

```rb
add = -> (x, y) {
  x + y
}
p add.call(1, 2) 
#=> 3
```

## Enumerable#lazy 

```rb
p (1..Float::INFINITY).lazy.map { |i|  
  i ** 2 
}.take(3).force
#=> [1, 4, 9]
```

## Fiber

```rb
f = Fiber.new {
  x = 0
  loop do
    Fiber.yield(x)
    x += 1
  end
}
3.times do
  p f.resume
end
```

```rb:出力
0
1
2
```

### 補足
pry では実行できませんでした。

```rb
pry(main)> f = Fiber.new {
Error: Cannot find local context. Did you use `binding.pry`?
```

## Module#prepend 

```rb
module M
  def foo
    puts "M#foo"
  end
end

class C
  prepend M
  
  def foo
    puts "C#foo"
  end
end

C.new.foo 
#=> M#foo
```

### 補足
継承関係としては、prependしたモジュールMがクラスCより前に来る。

```rb
p C.ancestors
#=>[M, C, Object, Kernel, BasicObject]
```

## Refinements
```rb
# Refinements
module M
  refine Fixnum do
    def /(other)
      self.quo(other)
    end
  end
end

p 1 / 2 
#=> 0

using M

p 1 / 2 
#=> (1/2)
```

### 補足
pry では using が有効でなかった。

```rb

pry(main)> # Refinements
pry(main)> module M
pry(main)*   refine Fixnum do
pry(main)*     def /(other)
pry(main)*       self.quo(other)
pry(main)*     end
pry(main)*   end
pry(main)* end
=> #<refinement:Fixnum@M>

pry(main)> p 1 / 2
0
=> 0

pry(main)> using M
=> main

pry(main)> p 1 / 2
0
=> 0
```


## 試験問題の例
以下のコードの実行結果として正しいものを選択してください

```rb
p ?x
```

```rb:選択肢A
?x
```

```rb:選択肢B 
"x"
```

```rb:選択肢C
120
```

```:選択肢D 
文法エラーが発生する
```

### 正解
選択肢B



# 参考リンク
## Rubyアソシエーション: Ruby技術者認定試験制度
http://www.ruby.or.jp/ja/certification/examination/

## Ruby 2.1.0 リリース (2.0 からの変更点)
https://www.ruby-lang.org/ja/news/2013/12/25/ruby-2-1-0-is-released/

## instance method Numeric#quo
http://docs.ruby-lang.org/ja/2.1.0/method/Numeric/i/quo.html

```
quo(other) -> Rational | Float | Complex
```

>
self を other で割った商を返します。 整商を得たい場合は Numeric#div を使ってください。
Numeric#fdiv が結果を Float で返すメソッドなのに対して quo はなるべく正確な数値を返すことを意図しています。 具体的には有理数の範囲に収まる計算では Rational の値を返します。 Float や Complex が関わるときはそれらのクラスになります。
Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。
[PARAM] other:
自身を割る数を指定します。
>

```rb
1.quo(3)      #=> (1/3)
1.0.quo(3)    #=> 0.3333333333333333
1.quo(3.0)    #=> 0.3333333333333333
1.quo(0.5)    #=> 2.0

Complex(1, 1).quo(1)  #=> ((1/1)+(1/1)*i)
1.quo(Complex(1, 1))  #=> ((1/2)-(1/2)*i)
```

> [SEE_ALSO] Numeric#fdiv

## instance method Numeric#div
http://docs.ruby-lang.org/ja/2.1.0/method/Numeric/i/div.html

```
div(other) -> Integer
```

>
self を other で割った整数の商 q を返します。
.....
商に対応する余りは Numeric#modulo で求められます。 div はメソッド / を呼びだし、floorを取ることで計算されます。
メソッド / の定義はサブクラスごとの定義を用います。
[PARAM] other:
自身を割る数を指定します。
>

```rb
p 3.div(2) # => 1
p (-3).div(2) # => -2
p (-3.0).div(2) # => -2
```

## instance method Fixnum#/
http://docs.ruby-lang.org/ja/2.1.0/method/Fixnum/i/=2f.html

```
self / other -> Fixnum | Bignum | Float
div(other) -> Fixnum | Bignum | Float
```

>
算術演算子。商を計算します。
[PARAM] other:
二項演算の右側の引数(対象)
[RETURN]
計算結果
>