範囲
範囲リテラル
- 範囲オブジェクトは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修飾子は1行で繰り返し処理の記載が可能
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の範囲で飛ばしている所は重要な所が多い。
優先度は下げるものの実務で必要な内容ばかりだと思われるので教本は斜め読みしよう・・