てきとうなメモ

本の感想とか技術メモとか

Rubyの勉強 (3) - 演算子

Rubyで用いられる演算子

高い   ::
       []
       +(単項)  !  ~
       **
       -(単項)
       *  /  %
       +  -
       << >>
       &
       |  ^
       > >=  < <=
       <=> ==  === !=  =~  !~
       &&
       ||
       ..  ...
       ?:(条件演算子)
       =(+=, -= ... )
       not
低い   and or

ほとんどはメソッドの特殊な表記である.例えば

irb> 1 + 1
=> 2
irb> 1.+(1)
=> 2

ただし,以下の演算子はメソッドではなく制御構造である.

=  ?:  ..  ...  !  not  &&  and  ||  or  ::

範囲演算子

'm..n'や'm...n'を用いると,m〜nまでの範囲を表すRangeオブジェクトが返される.'...'の場合はnを含まない.

irb> (0..10).class
=> Range
irb> (0..10).to_a
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
irb> (0...10).to_a
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
irb>

to_aはオブジェクトを配列で表現した値を返すメソッド.

文字列に対して範囲演算子を適用することもできる

irb> ("a".."e").to_a
=> ["a", "b", "c", "d", "e"]
irb> ("aa".."zz").to_a
=> ["aa", "ab", ... "zy", "zz"]

例えばfor文で用いたりする

for i in 0..9
  puts i
end

eachを使うと

(0..9).each {|i| puts i}

で同様のことができる

Floatのようにiterateできない場合はto_aやeachは失敗する.

irb> (0.1..0.2).to_a
TypeError: can't iterate from Float
irb> (0.1..0.2).each {|i| puts i}
TypeError: can't iterate from Float

ただし,include?などの他のメソッドは利用できる

irb> (0.1..0.2).include?(0.15)
=> true

a <=> b

比較演算子の一つ.a > bの時,正の値を返し,a < bの時,負の値を返し,a == bの時0を返すような演算子

irb> 1 <=> 2
=> -1
irb> 2 <=> 1
=> 1
irb> 1 <=> 1
=> 0

Array#sortでブロックが与えられない場合,デフォルトで<=>が用いられる

irb> [3, 1, 4, 2, 5].sort
=> [1, 2, 3, 4, 5]
irb> ["foo", "bar", "spam", "egg"].sort
=> ["bar", "egg", "foo", "spam"]

a === b

case文は===で比較を行う.

case month
when 3..5
  puts "spring"
when 6..8
  puts "summer"
when 9..11
  puts "autumn"
else
  puts "winter"
end

if (3..5) === month
  puts "spring"
elsif (6..8) === month
  puts "summer"
elsif (9..11) === month
  puts "autumn"
else
  puts "winter"
end

とほぼ同じ.ここで,Range#===はRange#include?と同じメソッドである.