2-7-6 範囲(Range)
1..5 : 5が含まれる
1...5 : 5が含まれない


In [7]:
# 数値の場合
p (1..5).include?(5)
p (1...5).include?(5)

# 日時の範囲
vacation = Time.at(1343746800)..Time.at(1343725199)
p vacation.begin
p vacation.end

# 繰り返し
abc = ('a'..'c')
abc.each do |c|
    p c
end


true
false
2012-08-01 00:00:00 +0900
2012-07-31 17:59:59 +0900
"a"
"b"
"c"
Out[7]:
"a".."c"

2-7-7 正規表現(Regexp)


In [17]:
# 0から9までの数の並びにマッチする正規表現
pattern = /[0-9]+/

# マッチしたかを真偽値で返す
p pattern === 'HAL 900'
p pattern === 'hogehoge'

# 最初にマッチした位置を返す
p pattern =~ 'HAL 900'
p pattern =~ 'hogehoge'

# リテラルの中では式展開もできる¥
name = "hoge"
/hello, #{name}/

/\/user\/bin/
p %r(/usr/bin)


true
false
4
nil
/\/usr\/bin/
Out[17]:
/\/usr\/bin/

2-7-8 %記法の括弧
%記法に使っている括弧には別の括弧や記号を使えます。


In [25]:
p %q{paren(and paren)}
p %r{/user/(bin|Lib)/}

# プレース以外の括弧類を使うこともできる。
# 括弧類
p %q<content1>
p %q[content2]

# 任意の記号
p %q|content3|
p %q!content4!


"paren(and paren)"
/\/user\/(bin|Lib)\//
"content1"
"content2"
"content3"
"content4"
Out[25]:
"content4"

2-7-9 手続きオブジェクト(Proc)
手続きオブジェクトは関数をオブジェクトとして表現したものです。


In [29]:
greeter = Proc.new { |name|
    puts "Hello, #{name}!"
}

p greeter.call 'Proc'
p greeter.call 'Ruby'

greeter2 = Proc.new { |name|
    name = name.capitalize
    puts "Hello, #{name}!"
}

p greeter2.call 'proc'

# 使いドコロ
# http://qiita.com/ryosukeA/items/64a4dc87fd00f5752090


Hello, Proc!
nil
Hello, Ruby!
nil
Hello, Proc!
nil

2-8 様々な代入式
2-8-1 多重代入


In [37]:
# 右辺の数が多い場合、無視される
a, b = 1, 2, 3
p a
p b

a, b = [1, 2, 3]
p a
p b

# 余った要素が配列として代入
a, *b = [1, 2, 3, 4]
p a
p b

# 左辺に対応する要素がない場合
c, d, e = [1, 2]
p c
p d
p e

# 多重代入は変数の交換する際に良く使う
f = 'f'
g = 'g'

f, g = g, f
p f
p g


1
2
1
2
1
[2, 3, 4]
1
2
nil
"g"
"f"
Out[37]:
"f"

2-8-2 自己代入
演算結果を自身に代入し直す自己代入を行う。


In [40]:
# 計算式
a = 1
p a += 1

p aa ||=2 # b = b || 2 と同じ


2
2
Out[40]:
2

2-9 例外


In [41]:
1/ 0

puts 'この行は実行されない'


ZeroDivisionError: divided by 0
(pry):381:in `/'
(pry):381:in `<main>'
/Users/Y_Fujikawa/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `eval'
/Users/Y_Fujikawa/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `evaluate_ruby'
/Users/Y_Fujikawa/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:323:in `handle_line'
/Users/Y_Fujikawa/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:243:in `block (2 levels) in eval'
/Users/Y_Fujikawa/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `catch'
/Users/Y_Fujikawa/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `block in eval'
/Users/Y_Fujikawa/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `catch'
/Users/Y_Fujikawa/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `eval'
/Users/Y_Fujikawa/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/iruby-0.2.2/lib/iruby/backend.rb:64:in `eval'
/Users/Y_Fujikawa/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/iruby-0.2.2/lib/iruby/backend.rb:12:in `eval'
/Users/Y_Fujikawa/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/iruby-0.2.2/lib/iruby/kernel.rb:74:in `execute_request'
/Users/Y_Fujikawa/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/iruby-0.2.2/lib/iruby/kernel.rb:41:in `run'
/Users/Y_Fujikawa/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/iruby-0.2.2/lib/iruby/command.rb:76:in `run_kernel'
/Users/Y_Fujikawa/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/iruby-0.2.2/lib/iruby/command.rb:33:in `run'
/Users/Y_Fujikawa/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/iruby-0.2.2/bin/iruby:5:in `<top (required)>'
/Users/Y_Fujikawa/.rbenv/versions/2.2.0/bin/iruby:23:in `load'
/Users/Y_Fujikawa/.rbenv/versions/2.2.0/bin/iruby:23:in `<main>'

In [42]:
# 発生した例外に処理を行う場合
begin
    1 / 0
rescue ZeroDivisionError
    puts '問題発生!'
end


問題発生!

2-10 外部ファイルの読み込み


In [43]:
require './lib.rb'

hoge


"HogeHoge"
Out[43]:
"HogeHoge"

In [46]:
require './lib'

hoge


"HogeHoge"
Out[46]:
"HogeHoge"