加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:48:09 所属栏目:百科 来源:网络整理
导读:我不知道这是否是散列问题或阵列问题,但是我不明白为什么要在第三个例子中使用星号(*)符号来获取填充数据的哈希.没有它,它输出一个空的哈希. # -*- coding: utf-8 -*-require 'pp'pp [[:first_name,'Shane'],[:last_name,'Harvie']]# = [[:first_name,"Shane
我不知道这是否是散列问题或阵列问题,但是我不明白为什么要在第三个例子中使用星号(*)符号来获取填充数据的哈希.没有它,它输出一个空的哈希.
# -*- 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有用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读