When you define a method with an optional argument and keyword arguments (whether explicitly or with options splat) the defaulted argument can not take a hash argument, instead it is interpreted as keyword arguments:
Foo.options({})# (irb):21: warning: The last argument for `options' (defined at (irb):6) is used as the keyword parameter# nil# {}Foo.kwarg({})# (irb):22: warning: The last argument for `kwarg' (defined at (irb):11) is used as the keyword parameter# nil# nilFoo.splat({})# (irb):23: warning: The last argument for `splat' (defined at (irb):16) is used as the keyword parameter# []# nilFoo.options({key: :value})# (irb):24: warning: The last argument for `options' (defined at (irb):6) is used as the keyword parameter# nil# {:key=>:value}Foo.kwarg({key: :value})# (irb):25: warning: The last argument for `kwarg' (defined at (irb):11) is used as the keyword parameter# ArgumentError (unknown keyword: :key)Foo.splat({key: :value})# (irb):26: warning: The last argument for `splat' (defined at (irb):16) is used as the keyword parameter# ArgumentError (unknown keyword: :key)