**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!