【问题标题】:Parameter passing in RubyRuby 中的参数传递
【发布时间】:2013-11-07 14:36:25
【问题描述】:

我有以下代码段

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 的。有什么想法吗?

【问题讨论】:

  • 故意编写模棱两可的代码,你会惊讶于它是如何被解释的。
  • 我很抱歉,我知道他们。我遇到了编辑器的问题。将审查它。同时,基于概念内容的答案会很棒!谢谢!
  • 你的分号和奇怪的缩进给人很不好的印象。
  • 这是否符合语法取决于 Ruby 的版本。在 2.1 中,它似乎不合语法。
  • 对于一些真正令人头疼的游戏:stackoverflow.com/a/17173107/2988

标签: ruby


【解决方案1】:

您将扩展列表数组传递给您的方法(我知道 * 为 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 的方式。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 非常感谢您的帮助!
    猜你喜欢
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    相关资源
    最近更新 更多