【问题标题】:Why do I need asterisk before an array?为什么在数组之前需要星号?
【发布时间】:2009-12-12 14:14:55
【问题描述】:

我不知道这是哈希问题还是数组问题,但我不明白为什么在第三个示例中需要星号 (*) 符号来获取填充数据的哈希。没有它,它会输出一个空哈希。

# -*- coding: utf-8 -*-
require 'pp'
pp [[:first_name, 'Shane'], [:last_name, 'Harvie']]
# => [[:first_name, "Shane"], [:last_name, "Harvie"]]

pp [[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten
# => [:first_name, "Shane", :last_name, "Harvie"]

pp Hash[*[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
# => {:first_name=>"Shane", :last_name=>"Harvie"}

pp Hash[[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten]
# => {}

下面是该方法的解释。

--------------------------------------------------------------- Hash::[]
     Hash[ [key =>|, value]* ]   => hash

     From Ruby 1.8
------------------------------------------------------------------------
     Creates a new hash populated with the given objects. Equivalent to
     the literal +{ _key_, _value_, ... }+. Keys and values occur in
     pairs, so there must be an even number of arguments.

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

【问题讨论】:

    标签: ruby arrays hash


    【解决方案1】:

    splat 运算符(即*)将原本是数组的内容转换为列表,以便在散列中赋值。你必须给[] 操作符一个实际的列表来转换成散列的键/值对。请参阅下面的 splat 运算符的简短描述链接,该运算符实际上可以执行此操作(将数组展开为列表)或相反(将列表收集到数组中)。

    按照你上面的方法,你给Hash[]奇数个项目,也就是一个数组。 (想想[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten 产生了什么。它产生[:first_name, 'Shane', :last_name, 'Havie']。)正如你引用的文档所说,[] 运算符必须有偶数个元素。请注意,以下(尽管无用)确实有效:

    >> Hash[[[:first_name, 'Shane'], [:last_name, 'Harvie']].flatten, 1]
    => {[:first_name, "Shane", :last_name, "Harvie"]=>1}
    

    (我不清楚为什么在使用上面的代码时没有收到“哈希的奇数个参数”错误 - 就像你尝试 Hash[1] 时一样。)

    一个更简单的例子可能会更清楚。首先,传入一个项目,一个数组。用*打开数组给Hash[]一个项目列表:

    >> Hash[['foo', 'bar', 'bizz', 'buzz']]
    => {}
    >> Hash[*['foo', 'bar', 'bizz', 'buzz']]
    => {"foo"=>"bar", "bizz"=>"buzz"}
    

    您可能还会发现this write-up about the splat operator and the double splat operator 很有用。

    【讨论】:

      猜你喜欢
      • 2014-04-10
      • 2015-05-15
      • 2021-06-21
      • 1970-01-01
      • 2011-05-10
      • 2015-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多