在Ruby中收集关键字参数

在Ruby中收集关键字参数,ruby,keyword-argument,Ruby,Keyword Argument,为了理解如何在Ruby中收集参数,我想出了以下代码片段,在某些情况下,它似乎无法在**kargs中收集关键字参数: def foo(i, j= 9, *args, k: 11, **kargs) puts "args: #{args}; kargs: #{kargs}" end foo(a: 7, b: 8) # output: args: []; kargs: {} foo(9, a: 7, b: 8) # output: args: []; kargs: {:a=>7, :b=&

为了理解如何在Ruby中收集参数,我想出了以下代码片段,在某些情况下,它似乎无法在
**kargs
中收集
关键字参数

def foo(i, j= 9, *args, k: 11, **kargs)
  puts "args: #{args}; kargs: #{kargs}"
end

foo(a: 7, b: 8)
# output: args: []; kargs: {}
foo(9, a: 7, b: 8)
# output: args: []; kargs: {:a=>7, :b=>8}
foo(9, 10, 13, a: 7, b: 8)
# output: args: [13]; kargs: {:a=>7, :b=>8}

我想知道为什么它在第一次调用
foo
时不收集
kargs
,而在第二次调用时收集。

这是因为第一个参数
I
,是一个必需的参数(没有默认值),所以,第一个值传递给方法(在第一个示例中,这是hash
{a:7,b:8}
)存储在其中

然后,由于其他所有内容都是可选的,因此将根据需要填写剩余的值(如果有,在本例中没有)。即,第二个参数将转到
j
,除非它是命名参数,否则它将转到
kargs
(或
k
)。第三个参数和任何剩余参数——直到第一个关键字参数,进入
args
,然后任何关键字args进入
kargs

def foo(i, j= 9, *args, k: 11, **kargs)
  puts "i: #{i}; args: #{args}; kargs: #{kargs}"
end

foo(a: 7, b: 8)
# i: {:a=>7, :b=>8}; args: []; kargs: {}

这是因为第一个参数
i
,是一个必需的参数(没有默认值),因此,传递给该方法的第一个值(在第一个示例中,这是散列
{a:7,b:8}
)被存储到该方法中

然后,由于其他所有内容都是可选的,因此将根据需要填写剩余的值(如果有,在本例中没有)。即,第二个参数将转到
j
,除非它是命名参数,否则它将转到
kargs
(或
k
)。第三个参数和任何剩余参数——直到第一个关键字参数,进入
args
,然后任何关键字args进入
kargs

def foo(i, j= 9, *args, k: 11, **kargs)
  puts "i: #{i}; args: #{args}; kargs: #{kargs}"
end

foo(a: 7, b: 8)
# i: {:a=>7, :b=>8}; args: []; kargs: {}

谢谢,我来看看。我想只有通过
foo({a:7,b:8})
调用时才会发生这种情况。也许这是一种Ruby方法来避免调用时出现错误?有什么方法可以避免这种情况发生吗?我正在尝试构建一个
curry
函数,该函数包括:
*args
**kw\u args
。请看,谢谢,我去看看。我想只有通过
foo({a:7,b:8})
调用时才会发生这种情况。也许这是一种Ruby方法来避免调用时出现错误?有什么方法可以避免这种情况发生吗?我正在尝试构建一个
curry
函数,该函数包括:
*args
**kw\u args
。请看