Rubyメモ

範囲オブジェクト

範囲オブジェクトは each や map に渡せばその範囲での繰り返しになるが、そのままでは配列にならない。そのため、to_a を使うなどをする。

(1..10).map{|c| print c} #=>12345678910
p (1..10)                # 1..10
p [1..10]                # [1..10]
p (1..10).to_a         # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
p [*1..10]               # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a = *1..10
p a                      # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

"*"演算子

代入式において複数の値を受け取ることができる。

a,*b = 1,2,3,4,5
# a => 1
# b => [2,3,4,5]

メソッドで複数の引数を受け取る場合に使う。(splat演算子と呼ばれる) メソッドの引数の配列の前に * をつけると、配列をここの引数に展開する。

def abc(a,b,c)
  puts "a:#{a} b:#{b} c:#{c}"
end
def my_printf(fmt, *args)  
  puts "#{fmt} #{args]"
end
a=[1,2,3]
abc(*a)                      # => abcを1,2,3 で呼び出す。(引数不足エラーにならない)
my_printf("%s", *a)     # => my_printf("%d", 1,2,3) と同じ。
                                #       この結果、fmt="%d", args=[1,2,3] となる

関数の中間の引数に * を使うこともできる。

def abc(a,*b,c)
  puts "a:#{a} b:#{b} c:#{c}"
end
abc(1,2)  
abc(1,2,3)
abc(1,2,3,4)

#--output--
a:1 b:[] c:2
a:1 b:[2] c:3
a:1 b:[2, 3] c:4

$<

標準入力の各行を返す。複数行で数値が渡されるような場合、

a = gets.to_i
b = gets.to_i
c = gets.to_i

とするが、これを

a,b,c = $<.map &:to_i

とすることができる