为什么数组前需要加星号?

2024-04-27

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

# -*- 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'].)正如您引用的文档所说,[]运算符必须具有偶数个元素。注意以下内容(虽然没用)does work:

>> 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"}

您可能还会发现这篇关于 splat 运算符和 double splat 运算符的文章 https://rubyinrails.com/2019/07/10/ruby-splat-operator-for-arguments/ useful.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么数组前需要加星号? 的相关文章

  • PySpark 用数组替换 Null

    通过 ID 连接后 我的数据框如下所示 ID Features Vector 1 50 Array 1 1 2 3 2 50 Null 我最终得到 向量 列中某些 ID 的空值 我想用 300 维的零数组替换这些 Null 值 与非空向量条
  • 在某些情况下,直接访问字符串的后备数组是否合理?

    我正在致力于优化文本处理软件 其中经常使用以下类 class Sentence private final char textArray private final String textString public Sentence Str
  • 这里不允许使用数组初始值设定项[重复]

    这个问题在这里已经有答案了 我正在开发 Android 项目 但收到一个我无法理解的错误 这里不允许使用数组初始值设定项 我试图简化我的代码 结果归结为这一点 public class MainActivity extends Activi
  • 使用 %w[] 创建包含空字符串的数组

    创建包含空字符串的数组 a b c 不是一个空格字符串 使用 W我可以用 W a b c 我也可以连接数组 但是是否可以使用空字符串创建数组 w 几个选项 W a b c z W a b c lt lt 我知道这没有使用 w 语法 但为了更
  • 如何使用aaply并保留数组中的维度顺序?

    我有一个 3 维数组 我想将函数应用于第三维并返回一个数组 我很高兴 plyr aaply 几乎能满足我的要求 但是它会交换我的数组的尺寸 文档告诉我它是幂等的 这 在我查找之后 让我认为结构应该保持不变 这是一个带有恒等函数的可重现示例
  • 这个角色是什么? ➡️0080➡0099

    这个字符是什么 u0080 u0099 这应该是撇号或单引号 我如何将它 使用 Ruby 转换为简单的单引号 或者在网页中将其作为单引号正确显示 Thanks 这是一个印刷正确的撇号 更准确地说是右单引号 U 2019 经过一些错误的字符代
  • 在php中如何设置数组的大小?

    我只想在 php 中设置数组的大小 而不必用任何值填充它 我怎么做 Use 固定阵列 http php net SplFixedArray对于固定大小的数组 array new SplFixedArray 3 array 0 1 array
  • 在 MATLAB 中用两个值替换向量值

    我必须创建一个以向量作为输入的函数v和三个标量a b and c 该函数替换了的每个元素v等于a有一个二元素数组 b c 例如 给定v 1 2 3 4 and a 2 b 5 c 5 输出将是 out 1 5 5 3 4 我的第一次尝试是尝
  • Javascript Concat 多维数组

    我正在尝试连接一个多维数组 以便可以迭代并显示所有数据 有一篇关于如何访问嵌套数据的非常好的帖子here https stackoverflow com questions 11922383 access process nested ob
  • Ruby - 乘法问题

    我的输出是这样的 ruby 1 9 2 p290 011 gt 2 32 3 gt 6 959999999999999 我记得有一天在另一台机器上我得到了它就像 2 32 3 6 我的错误是什么 非常感谢您阅读本文 如果您确实想向下舍入为整
  • HTML 表单:POST 对象数组

    提交班级名单 一次添加3名学生 每个学生都有最初 最后的年龄 问题 我们如何才能将所有学生放入数组中 students 0 gt Array first gt first name for 0 last gt last name for 0
  • Ruby IMAP IDLE 并发 - 如何解决?

    我正在尝试构建一个 目前是私有的 Web 应用程序 该应用程序将利用 IMAP IDLE 连接在人们到达时显示电子邮件 我很难弄清楚如何将其组合在一起 以及它如何与我的 Heroku RoR 服务器结合在一起 我编写了一个用于连接到 IMA
  • 在 Sinatra 中缓存响应的最佳方式?

    我正在使用我用 Sinatra 制作的 API 构建一个简单的应用程序 该 API 返回一些 JSON 这是相当多的 JSON 我的应用程序的 API 依赖于对其他 API 的数百个请求 我大概可以将结果缓存 5 天左右 数据完全没有问题
  • 您可以使用 Jekyll 的 _includes 文件夹中的子目录吗?

    我的计划是在 includes目录 包括 页脚 包括 英雄 includes cta etc 当我引用那个时 include footers footer1 html 我收到以下错误 Liquid Exception Included fi
  • 使用 memcpy 复制二维数组?

    所以我想将二维数组的内容复制到另一个完全相同类型的数组 以下是数组的创建方式 GridUnit newGrid newGrid new GridUnit width for int i 0 i lt width i newGrid i ne
  • 覆盖 Rails ActiveRecord 销毁行为的最佳方法是什么?

    我有一个应用程序 我想在其中覆盖许多模型的销毁行为 用例是用户可能有删除特定记录的合法需要 但实际上从数据库中删除该行会破坏引用完整性 从而影响其他相关模型 例如 系统的用户可能想要删除不再与其有业务往来的客户 但需要维护与该客户的交易 看
  • 您推荐使用哪些工具来分析 Rails 应用程序? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我一直在寻找 Rails 的分析工具 我目前正在玩和测试 ruby prof 和 Railsbench 但我对使其工作所需的大量调整和修改
  • 二维数组中的寻路

    假设我有这个二维数组地图 0 0 0 0 7 1 1 1 1 1 1 1 1 0 7 7 7 7 1 1 1 24 1 1 1 1 0 7 24 24 24 24 24 24 24 1 1 3 1 0 7 23 23 23 23 23 23
  • C++:创建一个由用户输入大小的数组

    我想知道我们是否可以创建一个具有用户指定大小的数组 Ex int a cout lt lt Enter desired size of the array cin gt gt a int array a 上面的程序将不起作用 因为数组大小必
  • 在 C 中使用另一个结构中的二维结构数组的编码问题

    我正在使用一个二维结构数组 它是另一个结构的一部分 这不是我做过很多事的事情 所以我遇到了问题 该函数在接近末尾的 测试 for 循环后最终失败 它在出现段错误之前正确打印出一行 我的代码中将数据读入虚拟二维结构数组的部分工作得很好 所以它

随机推荐