【问题标题】:Hash[string.split(...)] vs Hash[*string.split(...)]Hash[string.split(...)] vs Hash[*string.split(...)]
【发布时间】:2013-07-06 08:37:12
【问题描述】:

试图理解为什么这会返回一个很好的填充哈希:

 Hash[*myString.split("\n")]

虽然这会返回一个空哈希?

 Hash[myString.split("\n")]

我看到星号是关键,它表示可变长度参数...但是 Hash[...] 的要求之一是它可以采用偶数数组并将其转换为有效的哈希。好吧,在我上面的第二个例子中,新行上的 string.split 返回一个偶数数组,那么为什么 Ruby 不允许呢?

【问题讨论】:

    标签: ruby hash


    【解决方案1】:

    这是因为 splat * 字符将数组扩展为每个单独的元素,而不是作为一个整体传入数组。来自 Ruby 2.0 哈希文档:

    Hash["a", 100, "b", 200]             #=> {"a"=>100, "b"=>200}
    Hash[ [ ["a", 100], ["b", 200] ] ]   #=> {"a"=>100, "b"=>200}
    Hash["a" => 100, "b" => 200]         #=> {"a"=>100, "b"=>200}
    

    使用Hash[] 方法传入元素只是按照您的预期格式化散列。比较一下

    Hash[ Array.new ]
    

    它返回一个空的散列,因为你实际上给了它奇数个参数,这些参数不会映射到正确的散列。

    【讨论】:

    • 优秀的答案。当您说 splat 字符将数组扩展为每个单独的元素时,它为我点击了。传递一个 Array 不算是传递多个参数,因为它只是一个对象。谢谢! (一旦网站允许我将标记为答案)。
    • 很高兴我能帮上忙!实际上我从来没有想过使用这种方法来实例化哈希,所以查看文档教会了我一两件事!
    【解决方案2】:

    完全同意现有的答案,但这里有一个更明确的例子,可以阐明为什么在这种情况下需要 splat:

    test_string = "my\ntest\nstring"
    
    [test_string.split("\n")]  #=> [["my", "test", "string"]]
    [*test_string.split("\n")] #=> ["my", "test", "string"]
    

    如您所见,如果没有 splat,您将给 Hash[] 一个参数(一个数组),而不是多个参数。

    【讨论】:

      猜你喜欢
      • 2010-10-16
      • 2011-10-11
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 2013-12-08
      • 2015-08-03
      相关资源
      最近更新 更多