Ruby 我要搞懂你 (2) Splat operater

定義非必要參數

splat operater (*) 用法通常在 method 的非必要參數上面

def add(*nums)
  puts nums.inject(&:+)
end

add 1,2
# 3
add 1,2,3,4,5
# 10

延伸閱讀:Ruby Enumerable module 系列文-reduce(inject)

當然也可以給預設參數

def say(a=1,b=2)
  puts a
  puts b
end

say
#1
#2

double splat (**) 代表的是 hash 參數

def double_splat(**hash)
 p hash
end
 
double_splat()
# => {}
 
double_s(a: 1)
# => {:a => 1}
 
double_splat(a: 1, b: 2)
# => {:a => 1, :b => 2}
 
double_splat('not a hash')
# error

array 操作

splat operater 也可以用來解構 array,
比如說將 array 解構後傳入函式中

def add(a, b)
  puts a+b
end
nums = [1,2]
add *nums
# 3

強制轉換型別

words  = *"hello world"
# => ["hello world"]

解構 array

data = [1, 2, 3, 4]
 
a, *b = data
puts "#{a}, #{b}"
# => 1, [2, 3, 4]
*a, b = data
puts "#{a}, #{b}"
# => [1, 2, 3], 4
 
a, *b, c = data
puts "#{a}, #{b}, #{c}"
# => 1, [2, 3], 4