LoginSignup
4
3

More than 5 years have passed since last update.

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

Posted at

範囲

範囲リテラル

  • 範囲オブジェクトは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の範囲で飛ばしている所は重要な所が多い。
優先度は下げるものの実務で必要な内容ばかりだと思われるので教本は斜め読みしよう・・

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3