範囲オブジェクト
範囲オブジェクトは 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
とすることができる