红宝石 – 为什么我需要一个数组前的星号?

前端之家收集整理的这篇文章主要介绍了红宝石 – 为什么我需要一个数组前的星号?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我不知道这是否是散列问题或阵列问题,但是我不明白为什么要在第三个例子中使用星号(*)符号来获取填充数据的哈希.没有它,它输出一个空的哈希.
# -*- coding: utf-8 -*-
require 'pp'
pp [[:first_name,'Shane'],[:last_name,'Harvie']]
# => [[:first_name,"Shane"],"Harvie"]]

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

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

pp Hash[[[:first_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,'Harvie']].flatten,1]
=> {[:first_name,"Harvie"]=>1}

(我不明白为什么在使用上面的代码时,您不会得到“奇数数目的哈希参数”错误 – 如果您尝试使用Hash [1]).

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

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

请参阅this blog post以获得更全面的解释.您也可能会发现this short write-up about the splat operator有用.

猜你在找的Ruby相关文章