为什么 Hash#select 和 Hash#reject 将键传递给一元块?

2023-11-21

我的理解是Hash#select and Hash#reject每个都传递一个键及其值的数组[key, value]作为每次迭代的单个块参数,您可以使用隐式破坏性赋值直接在块内单独选取它们:

{a: 1, b: 2}.select{|k, v| k == :a} # => {:a => 1}
{a: 1, b: 2}.reject{|k, v| v == 1} # => {:b => 2}

或显式破坏性赋值:

{a: 1, b: 2}.select{|(k, v)| k == :a} # => {:a => 1}

我预计,当我通过一个一元块时,整个[key, value]数组将被传递,但实际上,似乎传递了密钥:

{a: 1}.select{|e| p e} # => Prints `:a`  (I expected `[:a, 1]`)

为什么会这样呢?对于他人Hash实例方法如map, 整体[key, value]数组已传递。

如果它是专门设计用于一元块与二进制块不同的工作方式,那么我可以理解它是有用的。但是,那么我不明白为什么上面带有显式破坏性赋值的情况会按原样工作。而且没有找到任何提及此类规范的文档。

Edit我得到了错误的结果{a: 1, b: 2}.reject{|(k, v)| v == 1}。这里更正一下:

{a: 1, b: 2}.reject{|(k, v)| v == 1} # => {:a=>1, :b=>2} (not `{:b=>2}`)

现在,这也表明(k, v) is the key, not [key, value], so v总是nil。比照。 Darek Nędza 的评论。


它实际上总是传递两个参数。

您所观察到的只是 procs 和 lambda 处理多余参数的方式之间的差异。块(Procs,除非您另外告诉 Ruby)的行为就好像它有一个额外的 splat 并丢弃多余的参数,而 lambda(和方法对象)由于数量不正确而拒绝调用者。

示范:

>> p = proc { |e| p e }
=> #<Proc:0x007f8dfa1c8b50@(irb):1>
>> l = lambda { |e| p e }
=> #<Proc:0x007f8dfa838620@(irb):2 (lambda)>
>> {a: 1}.select &p
:a
=> {:a=>1}
>> {a: 1}.select &l
ArgumentError: wrong number of arguments (2 for 1)
    from (irb):2:in `block in irb_binding'
    from (irb):4:in `select'
    from (irb):4
    from /usr/local/bin/irb:11:in `<main>'

顺便说一句,因为评论中提到了:map相比之下,实际上传递了一个参数。它被分配给两个不同的变量,因为您可以使用赋值运算符右侧的数组来分配多个变量,但它实际上始终是一个参数。

示范:

>> {a: 1}.map { |k, v| p k, v }
:a
1
>> {a: 1}.map &p
[:a, 1]
=> [[:a, 1]]
>> {a: 1}.map &l
[:a, 1]

并且在改变后p and l进一步定义:

>> p = proc { |k, v| p k, v }
=> #<Proc:0x007ffd94089258@(irb):1>
>> l = lambda { |k, v| p k, v }
=> #<Proc:0x007ffd940783e0@(irb):2 (lambda)>
>> {a: 1}.map &p
:a
1
=> [[:a, 1]]
>> {a: 1}.map &l
ArgumentError: wrong number of arguments (1 for 2)
    from (irb):2:in `block in irb_binding'
    from (irb):4:in `each'
    from (irb):4:in `map'
    from (irb):4
    from /usr/local/bin/irb:11:in `<main>'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Hash#select 和 Hash#reject 将键传递给一元块? 的相关文章

  • 避免在 Ruby 中自动从 Fixnum 转换为 Bignum

    我正在将算法从 C 移植到 Ruby 该算法有一个方法返回一个int有时会溢出 private static int NextRandom int n return 1234567890 n 12345 该算法利用溢出来避免该函数返回的值超
  • 测试 Ruby 字符串或符号的字符串相等(而不是对象相等)的最简洁方法?

    我总是这样做来测试 Ruby 中的字符串相等性 if mystring eql yourstring puts same else puts different end 这是在不测试对象相等性的情况下执行此操作的正确方法吗 我正在寻找最简洁
  • Rails Partial (Rails 3, HAML) 任意慢

    我使用的是 Rails 3 0 1 HAML 0 3 22 和 Mongrel 1 1 5 MongoMapper 不是 AR 我正在渲染一个列表 每个列表项都是它自己的部分 每次页面渲染其中一个列表项部分时 渲染时间都会延长近 100 倍
  • Ruby:如何计算相对于另一条路径的路径?

    假设我知道我开始的绝对路径和我试图到达的绝对路径 first first path second second path 现在我想弄清楚如何构建一条相对于第一个路径 例如 answer should be first path second
  • 如何检查rails上传的文件类型?

    我如何查看即将到来的文件类型 例如 csv 或 xls 请给个代码 我得到文件是这样的 aut name uploaded io original filename File open Rails root join public uplo
  • ruby 的 StringIO 类到底是什么?

    我想我明白StringIO有点类似于Java的StringBuffer类 但我不太完全理解 您将如何定义它及其在 Ruby 中的用途 可能的用途 只是希望能够消除我的困惑 no StringIO http ruby doc org stdl
  • 标记(lex?parse?)正则表达式

    使用 Ruby 我想获取一个 Regexp 对象 或表示有效正则表达式的字符串 您的选择 并将其标记化 以便我可以操作某些部分 具体来说 我想采用这样的正则表达式 字符串 regex var w parts foo bar 并创建一个替换字
  • 如何让 Sinatra 通过 HTTPS/SSL 工作?

    正如标题所示 谷歌没有提供任何与此相关的有用信息 如何为 Sinatra 应用程序设置和配置 HTTPS SSL 如何创建 HTTPS 路由 我以前从未在我的应用程序中使用过 HTTPS 也没有调整 Rack 其他内容的经验 所以我很欣赏详
  • ruby on Rails,会话过期通知

    我正在使用 ruby 1 9 3 和 Rails 3 2 我的实际会话处理如下所示 会话助手 def sign in user cookies remember token value user remember token expires
  • 从类内部调用属性访问器方法[重复]

    这个问题在这里已经有答案了 我正在尝试调用我的类属性编写器之一 但由于某种原因它永远不会被调用 下面是一些代码 可以使这一点更清楚 class Test attr reader test def test val puts Called t
  • 如何编写一个在安装 RubyGem 时调用的钩子?

    我想编写一个 Ruby 片段 当我的 Gem 首次安装时运行 sudo gem install mygem 能做到吗 看起来并没有真正支持 我发现了一个 post install message 属性 您应该能够在 gem 规范中设置该属性
  • Ruby 可选参数和多个参数

    我试图将方法的第一个参数设置为可选 后跟任意数量的参数 例如 def dothis value 0 args 我遇到的问题是 这似乎实际上不可能 当我打电话时dothis hey how are you good 我希望它将值设置为默认值
  • 什么是 - 获取的是一个目录 - 错误消息

    我收到这个奇怪的错误 Users gideon Documents ca ruby rubytactoe lib player rb 13 in gets Is a directory spec Errno EISDIR 玩家规格 rb r
  • 为什么 rand() 总是返回相同的数字?

    我在用 兰特 200 在我的 Rails 应用程序中 当我在控制台中运行它时 它总是返回随机数 但如果我在应用程序行中使用它 index rand 200 索引总是相同的号码 为什么会这样以及如何克服这个问题 简单的伪随机数生成器实际上生成
  • 下载所有 gems 依赖项

    我想通过下载任何所需的文件并将它们带到另一台计算机来安装指南针没有互联网连接 我已经下载了指南针的源包 当我在未连接的计算机上运行 gem 时 它抱怨缺少依赖项 有什么解决办法吗 这正是我遇到的问题 经过一段时间的搜索后 我找到了一个可以使
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例
  • 为什么||和 或 在 Rails 中的行为有所不同? [复制]

    这个问题在这里已经有答案了 可能的重复 i true 和 false 在 Ruby 中是真的吗 https stackoverflow com questions 2802494 i true and false in ruby is tr
  • 如何使用 Ruby on Rails 3 检查 HTTP 请求的“Content-Length”字段?

    我正在使用 Ruby on Rails 3 在我的视图文件中我有以下代码 为了避免服务器过载 我会在服务器接收上传文件之前检查上传文件的大小 这是因为 按下表单的提交按钮 服务器会先完整接收文件 然后再检查文件 我知道一个HTTP 请求有标
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • 用于验证目的的动态查找方法

    我正在使用 Ruby on Rails 3 0 7 我想在运行时查找一些记录以进行验证 但为该查找方法传递 设置一个值 也就是说 在我的班级中 我有以下内容 class Group lt lt ActiveRecord Base valid

随机推荐

  • 如何将所有 li 元素移动到

    我想全部搬走li左侧的元素ul元素 看起来像第一个li元素的左边距 gt 0 我不明白 你知道我该如何解决这个问题吗 最终目标是 第一li页脚中的元素 music 和 email 元素具有相同的 70px 左边距 距左边框的距离相同 htm
  • 如何将空字符串解析为 None?

    将空字符串解析为空字符串的惯用方法是什么 None而不是一个Some let handle Option
  • Logback - 如何让每个记录器记录到单独的日志文件?

    我的应用程序有很多 EJB 当前的定制 Logger 实现创建一个像这样的记录器 私有静态 Logger logger Logger getInstance SERVICE NAME 并且日志记录将写入文件 路径 SERVICE NAME
  • 如何同步(使原子化)从两个进程写入一个文件?

    我有两个进程 每个进程都写入大量数据缓冲区 并且我想控制同步这些进程对一个文件的写入 进程1写入缓冲区A 包括 A1 A2 A3 进程2写入缓冲区B 包括 B1 B2 B3 当我们使用write 将这些缓冲区写入磁盘到同一文件的系统调用 一
  • 缩放和平移画布后鼠标坐标不匹配

    我对 javascript 和 canvas 非常陌生 我有一个程序应该检测椭圆路径上的动画元素 它后来形成一棵树 但这是我链接到 jsfiddle 的基本结构 它在没有缩放或平移的情况下工作正常 但一旦我尝试缩放或平移 鼠标坐标就会失控
  • 带有复制构造函数的enable_if

    我在尝试std enable if第一次并挣扎 任何指导将不胜感激 作为一个玩具示例 这是一个简单的静态vector类 我想为其定义一个复制构造函数 但行为取决于向量的相对大小 只需将数据复制到更小或相同大小的向量中 将数据复制到更大的向量
  • sigaction 和 signal 有什么区别?

    我正要向我们这里的应用程序添加一个额外的信号处理程序 我注意到作者使用了sigaction 设置其他信号处理程序 我本来打算用signal 为了遵循约定 我应该使用sigaction 但如果我从头开始写作 我应该选择哪个 Use sigac
  • 打印在地图中时不打印,Python

    primes 2 3 5 7 prime numbers map lambda x print x primes 它不打印任何内容 这是为什么 我试过了 sys stdout write x 也是 但也不起作用 Since lambda x
  • 字符串文字的最大长度?

    我正在尝试创建一个长字符串文字 并将其存储在 std string 中 如果我创建一个最多大约 2600 个字符的文字 则所有内容都可以正常打印 如果超过这个符号数量 我只会打印一些随机的垃圾字符 我一直使用 C 标准作为指导 环境限制被指
  • 与平台无关的字体​​目录?

    Windows macOS 和 Linux 上的字体存储在哪里 这是那些 简单 的问题之一 根据需要可以有一个过度的解决方案 Linux 发行版不使用任何特定的字体管理 使得不同 Linux 风格的字体不一致 非常可配置 并且受到许多因素
  • PHP 搜索字符串(带通配符)

    有没有办法在字符串中添加通配符 我之所以问这个问题 是因为目前我有一个函数可以在两个子字符串之间搜索子字符串 即抓取 我的狗有跳蚤 这句话中 我的 和 有跳蚤 之间的内容 从而得到 狗 function get string between
  • 没有周末的日差

    我想计算用户输入的总天数差异 例如当用户输入 start date 2012 09 06 and end date 2012 09 11 现在我正在使用这段代码来找出差异 count abs strtotime start date str
  • 如何在 C# 项目中使用 Windows 命令行安装 Nuget 包?

    我已经下载了 NuGet 版本 5 1 0 并尝试使用 cmd 安装其中一个包 log4net 它失败了 下面是错误 Microsoft Windows 版本 10 0 19042 1348 c Microsoft Corporation
  • Glassfish 中外部库的放置位置

    我使用 Netbeans 7 创建了一个 JSF2 项目 并成功将其部署在 Glassfish 3 1 上 不过 ear 文件已经变得相当大 6 5mb 其中大部分由外部 jar 文件 如 apache commons solrj prim
  • npm install openssl 在 Windows 10 上失败

    我在 Win10 的 Node js 命令窗口中运行以下命令 它失败了 有人知道如何解决它吗 我正在运行 Node js v7 3 0 C Users haozhang gt npm install openssl C Users haoz
  • WordPress,pre_get_posts 中有多个meta_key

    是否可以添加两个meta key s in pre get posts 我当前的查询 query gt set s query gt set meta key cat adresse stadtteil query gt set meta
  • 类别方法可以被重写吗? IOS

    我正在尝试计划如何向某些对象的所有实例添加一些方法 我认为向父对象 UIViewController 添加一个类别可以满足我想要做的事情 但是我可以重写以这种方式添加的方法吗 大多数情况下 子类将使用默认方法 但我确实知道我需要至少重写该方
  • 在 Android 操作系统中使用 SSLSocket 的 TLS 连接速度很慢

    我正在开发一个 Android 应用程序 它使用 SSLSocket 连接到服务器 这是我正在使用的代码 Connect if socket null socket isClosed socket isConnected if socket
  • “var self = this”方法背后的基本原理是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 JS var self this 当查看用 JavaScript 编写的任意代码 例如在 GitHub 上 时 许多开发人员使用var self this然后使用self代替this来引用当前对象 这
  • 为什么 Hash#select 和 Hash#reject 将键传递给一元块?

    我的理解是Hash select and Hash reject每个都传递一个键及其值的数组 key value 作为每次迭代的单个块参数 您可以使用隐式破坏性赋值直接在块内单独选取它们 a 1 b 2 select k v k a gt