gpt4 book ai didi

ruby - 为什么数组前需要星号?

转载 作者:数据小太阳 更新时间:2023-10-29 06:38:41 25 4
gpt4 key购买 nike

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

# -*- 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}

最佳答案

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有用。

关于ruby - 为什么数组前需要星号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1893557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com