当我没有提供可选的命名参数(:to)时,为什么Ruby 2.3.1会自动扩展我的哈希参数?如何防止这种情况?

def qsend(*args, to: nil,  **opts)
    puts "args: #{args}, opts: #{opts}"
end

qsend({ a: 1, b: 2, c: 3 })
qsend({ a: 1, b: 2, c: 3, d: 4 }, to: "me")

输出:

args: [], opts: {:a=>1, :b=>2, :c=>3}
args: [{:a=>1, :b=>2, :c=>3, :d=>4}], opts: {}

当我从参数列表中删除args时,我的哈希值不会在第二次调用中被删除到opts中,但会引发错误:"wrong number of arguments (given 1, expected 0) (ArgumentError)" . 当我从参数列表中删除opts时,我的哈希值不会在第一次调用中被丢弃到args中 - 这次会再次抛出错误:"unknown keywords: a, b, c (ArgumentError)" . 使用args = {}而不是* args没有区别 .

以下调用有效(第一次调用中的哈希将被删入args),但是没有更好的方法吗?

qsend({ a: 1, b: 2, c: 3 }, {})

我宁愿在方法定义中解决问题 .

编辑:方法重命名,输出固定 .