**args は引数として期待していないハッシュが送られてきた時にとりあえず受け取ってくれるものらしい

def log(msg, level: "ERROR", time: Time.now)
  puts "#{ time.ctime } [#{ level }] #{ msg }"
end

みたいなメソッドがあった時に、正しくハッシュを渡してやると

log('Hi!', level: 'ERROR', time: Time.now) #=> Thu Nov 13 01:42:07 2014 [ERROR] Hi!

みたいに返ってくるわけなのですが、これに対して余分なハッシュを送った場合、下記のように例外を吐きます。

log('Hi!', level: 'ERROR', time: Time.now, date: Time.now) #=> ArgumentError: unknown keyword: date

もしこれが嫌なとき、つまり期待するハッシュ以外のハッシュがきても別にスルーしてほしい時などには ** で受け取ってやるといいみたいです。

こんなかんじで。

def log(msg, level: "ERROR", time: Time.now, **kwrest)
  puts "#{ time.ctime } [#{ level }] #{ msg }"
end

 

そうすれば期待しないハッシュを送っても例外を吐きません。

log('Hi!', level: 'ERROR', time: Time.now, date: Time.now) #=> Thu Nov 13 01:45:11 2014 [ERROR] Hi!
log('Hi!', date: Time.now) #=> Thu Nov 13 01:45:19 2014 [ERROR] Hi!

Ref.