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

#範囲
##範囲リテラル
- 範囲オブジェクトはRangeクラスのインスタンスとなる
- includeメソッドで値があるかの判断をする
- ..の場合は最終値を含み ...の場合は最終値を含まない
- 文字列や配列から範囲指定による抽出が可能

```hani.rb
atai1_3 = (1..3) #1から3以下
atai1_9 = (1...10) #1から10未満
ataiA_C = ("A".."C")
hairetu = ["a", "b", "c", "d"]
mojiretu = "abcdefghijklmn"

p "#{atai1_3} #{atai1_3.class}" # --> 1..3 Range
p atai1_3.include?(2)  # --> true
p atai1_3.include?(3)  # --> true
p atai1_9.include?(1)  # --> true
p atai1_9.include?(9)  # --> true
p atai1_9.include?(10) # --> false
p atai1_3.include?(4)  # --> false
p (atai1_3 == 2)       # --> false
p (atai1_3 == (1..3))  # --> true
p (atai1_3 == (1..2))  # --> false
p (atai1_3 === 2)      # --> true (include?と同じ意味になる)

for i1 in atai1_3
	p i1 # --> 1,2,3が順に出力される
end

for i2 in ataiA_C
	p i2 # --> "A"."B","C"が順に出力される
end

p hairetu[1..3]   # --> 配列を範囲取得する ["b","c","d"]
p mojiretu[2..3]  # --> 文字列から範囲取得する "cd"
p mojiretu[2...3] # --> 文字列から範囲取得する "c"
```

##while範囲指定,until,後置while,while修飾子
- whileは継続条件を指定
- untilは終了条件を指定
- 後置whileはdo-whileと同じ
- while修飾子は１行で繰り返し処理の記載が可能

```while.rb
cond = (0..3)
# while (doの省略可能)
i = 0
while cond.include?(i) do
	i+=1
	p "while --> #{i}"
end

# until (doの省略可能)
i = 0
until !cond.include?(i) do
	i+=1
	p "until --> #{i}"
end

# 後置while (doの省略可能)
i = 0
begin
	i+=1
	p "do-while --> #{i}"
end while cond.include?(i)

# while修飾子
i = 0
p "while修飾子 #{i+=1}" while cond.include?(i)
```

結果

```
% ruby while.rb                                                                                                                                                                                [18:02:46]
"while --> 1"
"while --> 2"
"while --> 3"
"while --> 4"
"until --> 1"
"until --> 2"
"until --> 3"
"until --> 4"
"do-while --> 1"
"do-while --> 2"
"do-while --> 3"
"do-while --> 4"
"while修飾子 1"
"while修飾子 2"
"while修飾子 3"
"while修飾子 4"
```

#正規表現
Goldの範囲のようなので一旦飛ばします

#コマンド出力
- バッククォートで指定することでコマンド実行可能
- パーセント記法 %x でもコマンド実行可能

```
% irb                                                                                                                                                                                          [18:09:47]
2.1.6 :001 > p `date`
"Sun Apr 10 18:09:52 JST 2016\n"
 => "Sun Apr 10 18:09:52 JST 2016\n"
2.1.6 :002 > p %x[date]
"Sun Apr 10 18:09:56 JST 2016\n"
 => "Sun Apr 10 18:09:56 JST 2016\n"
2.1.6 :003 >
```


#ブロック
- 新たなスコープを持つ処理群
- yield(イールド)にてブロック内処理が実行される
- 処理をメソッドに渡す事ができる
- 呼び出し元の処理を持ち込む事ができる（クロージャ）
- Procとしてオブジェクト管理が可能

```block.rb
def block01(a)
	# ブロックが指定されているか
	if block_given?
		return a + yield(2, 3)
	end
	return 0
end

# block01 から直接workは参照できないが
work = 10;

ret = block01(100) do | x, y |
	x * y + work #block経由でアクセスし処理として実行する事ができる
end

p "block指定あり ret --> #{ret}"

ret = block01(100)

p "block指定なし ret --> #{ret}"

proc = Proc.new{|x, y| x * y + work}

ret = 100 + proc.call(2, 3)

p "proc直接Call ret --> #{ret}"

ret = block01(100, &proc)

p "proc指定あり  ret --> #{ret}"
```

結果

```
% ruby block.rb
"block指定あり ret --> 116"
"block指定なし ret --> 0"
"proc直接Call ret --> 116"
"proc指定あり  ret --> 116"
```

#lambda(ラムダ)
Goldの範囲のようなので一旦飛ばします

#Thread(スレッド)
Goldの範囲のようなので一旦飛ばします

#Fiber(ファイバ)
Goldの範囲のようなので一旦飛ばします

#大域脱出
Goldの範囲のようなので一旦飛ばします

#例外処理
Goldの範囲のようなので一旦飛ばします



***
Goldの範囲で飛ばしている所は重要な所が多い。
優先度は下げるものの実務で必要な内容ばかりだと思われるので教本は斜め読みしよう・・