Ruby中的参数传递

Ruby中的参数传递,ruby,Ruby,我有以下代码段 list=[2,4,6,8] def tester(p1,p2,p3,*p4) print p1 print '***' print p2 print '***' print p3 print '***' print p4 end tester('first','m'=>1,'t'=>2,'w'=>3,*list) 输出: first***w3m1t2***2***468 我没有理解p3是如何分配2的。

我有以下代码段

list=[2,4,6,8]
def tester(p1,p2,p3,*p4)
    print p1
    print '***'
    print p2
    print '***'
    print p3
    print '***'
    print p4
end
tester('first','m'=>1,'t'=>2,'w'=>3,*list)
输出:

first***w3m1t2***2***468

我没有理解
p3
是如何分配
2
的。有什么想法吗?

2是
list
数组的第一个元素。Ruby将
'm'=>1、't'=>2、'w'=>3
视为一个参数(
Hash
实例),因此第三个参数(p3)是
list
数组的第一个元素,因为您使用splat运算符(*)传递
list
,将数组转换为参数的“list”

您将扩展的列表数组传递给您的方法(我知道*是splat),因此它与调用

tester('first','m'=>1,'t'=>2,'w'=>3,2,4,6,8);
或者换一种说法

tester('first',{'m'=>1,'t'=>2,'w'=>3}, 2, 4, 6, 8);

在方法定义中,
*p4
并不表示最后一个数组,它表示剩余的任何内容。因此,我认为前三个参数被分配给p1、p2和p3,其余参数被分配给p4。p3就是这样变成2的。

故意编写模棱两可的代码,你会惊讶于它是如何被解释的。对此我很抱歉,我知道。我和编辑有问题。我们将对其进行审查。同时,一个基于概念内容的答案将是伟大的!谢谢分号和奇怪的缩进给人的印象很糟糕。这是否符合语法取决于Ruby的版本。在2.1中,它似乎不符合语法。对于一些真正令人头疼的问题,请尝试一下:非常感谢您的帮助!