你能为 Ruby 中的 map(&:method) 语法提供参数吗?

2023-12-27

您可能熟悉以下 Ruby 简写(a是一个数组):

a.map(&:method)

例如,在 irb 中尝试以下操作:

>> a=[:a, 'a', 1, 1.0]
=> [:a, "a", 1, 1.0]
>> a.map(&:class)
=> [Symbol, String, Fixnum, Float]

语法a.map(&:class)是一个简写a.map {|x| x.class}.

在“中阅读有关此语法的更多信息".

通过语法&:class,您正在进行方法调用class对于每个数组元素。

我的问题是:你能为方法调用提供参数吗?如果是这样,怎么办?

例如,如何转换以下语法

a = [1,3,5,7,9]
a.map {|x| x + 2}

to the &: syntax?

我并不是建议&:语法更好。 我只是对使用的机制感兴趣&:带参数的语法。

我想你知道+是 Integer 类的方法。您可以在 irb 中尝试以下操作:

>> a=1
=> 1
>> a+(1)
=> 2
>> a.send(:+, 1)
=> 2

您可以创建一个简单的补丁Symbol像这样:

class Symbol
  def with(*args, &block)
    ->(caller, *rest) { caller.send(self, *rest, *args, &block) }
  end
end

这将使您不仅能够做到这一点:

a = [1,3,5,7,9]
a.map(&:+.with(2))
# => [3, 5, 7, 9, 11] 

还有很多其他很酷的东西,比如传递多个参数:

arr = ["abc", "babc", "great", "fruit"]
arr.map(&:center.with(20, '*'))
# => ["********abc*********", "********babc********", "*******great********", "*******fruit********"]
arr.map(&:[].with(1, 3))
# => ["bc", "abc", "rea", "rui"]
arr.map(&:[].with(/a(.*)/))
# => ["abc", "abc", "at", nil] 
arr.map(&:[].with(/a(.*)/, 1))
# => ["bc", "bc", "t", nil] 

甚至与inject,它将两个参数传递给块:

%w(abecd ab cd).inject(&:gsub.with('cde'))
# => "cdeeecde" 

或者一些超级酷的东西,比如传递[速记]块to速记块:

[['0', '1'], ['2', '3']].map(&:map.with(&:to_i))
# => [[0, 1], [2, 3]]
[%w(a b), %w(c d)].map(&:inject.with(&:+))
# => ["ab", "cd"] 
[(1..5), (6..10)].map(&:map.with(&:*.with(2)))
# => [[2, 4, 6, 8, 10], [12, 14, 16, 18, 20]] 

以下是我与 @ArupRakshit 的对话,进一步解释了这一点:


正如@amcaplan 在中建议的那样下面评论 https://stackoverflow.com/questions/23695653/can-you-supply-arguments-to-the-mapmethod-syntax-in-ruby/23711606?noredirect=1#comment51873683_23711606,如果您重命名,您可以创建更短的语法with方法call。在这种情况下,Ruby 有一个针对这种特殊方法的内置快捷方式.().

所以你可以像这样使用上面的内容:

class Symbol
  def call(*args, &block)
    ->(caller, *rest) { caller.send(self, *rest, *args, &block) }
  end
end

a = [1,3,5,7,9]
a.map(&:+.(2))
# => [3, 5, 7, 9, 11] 

[(1..5), (6..10)].map(&:map.(&:*.(2)))
# => [[2, 4, 6, 8, 10], [12, 14, 16, 18, 20]] 

这是一个使用的版本改进 https://ruby-doc.org/core-3.1.1/doc/syntax/refinements_rdoc.html(这比全局猴子修补更简单Symbol):

module AmpWithArguments

  refine Symbol do
    def call(*args, &block)
      ->(caller, *rest) { caller.send(self, *rest, *args, &block) }
    end
  end

end

using AmpWithArguments

a = [1,3,5,7,9]
a.map(&:+.(2))
# => [3, 5, 7, 9, 11] 

[(1..5), (6..10)].map(&:map.(&:*.(2)))
# => [[2, 4, 6, 8, 10], [12, 14, 16, 18, 20]] 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

你能为 Ruby 中的 map(&:method) 语法提供参数吗? 的相关文章

  • 使用 mongodb/mongoid 排序时,有没有办法将所有 nil 值放在最后?

    除了问题中已有的内容之外 确实没什么可说的 使用 monoid People asc age 我首先得到零值 有没有办法总是返回nillast 或者告诉 mongodb 将 nil 视为非常高 与回答的完全一样sql中同样的问题在这里 ht
  • 使用rails-Ajax 调用控制器方法?

    我正在尝试从视图中的按钮执行 application controller rb 中的 Ruby 方法 在昨天的一篇文章中 有人告诉我使用 Ajax 调用来执行此操作 因为如果没有它 只会在页面加载时运行 我对此很陌生 很难理解它 我安装了
  • 在environment.rb中设置的常量在开发模式下消失

    了解 Rails 缓存如何工作的人可以真正帮助我 这是嵌套在 Rails Initializer run 块内的代码 config after initialize do SomeClass const set SOME CONST SOM
  • 对于所有 mime 类型,仅respond_to format.js

    我有一个响应 format js 的控制器 但是 大多数请求假设旧的 format html 仍然存在并抛出 404 异常 如何捕获控制器上的所有 MIME 请求并将它们仅重定向到 format js 这是当前控制器的操作 def sear
  • 如何在没有 sudo 的情况下安装 gem

    在我所有的 gem 安装中 我必须执行 sudo 所以 sudo gem 安装rails 会起作用 而只有 宝石安装导轨 不管用 我该如何补救 我安装了rvm murtaza murtaza dev which rvm home murta
  • Rails 路由:向 root 添加(浅层)关注

    在我的routes rb中 我定义了一个问题 如下所示 concern namespaceable do resources comments do resources replies 现在 我可以将此问题添加到任何资源中 resource
  • 捆绑安装无法安装 libxml-ruby

    我是 Ruby 世界的新手 我需要克隆一个现有项目 说明是 source env development bundle install 但它失败了 Using libv8 3 16 14 15 Fetching libxml ruby 2
  • Ruby 中的图像抓取

    如何使用 Nokogiri 抓取特定 URL 上存在的图像 如果有比 Nokogiri 更好的选择 请提出建议 css图像标签是 profilePic img 如果它只是一个 img 带有网址 PAGE http site com page
  • 用于从 Open3.popen3 标准输出中提取值的正则表达式

    如何获取外部命令的输出并从中提取值 我有这样的事情 stdin stdout stderr wait thr Open3 popen3 path foobar configfile if exit 0 wait thr value to s
  • ActiveRecord::Enum - PG::InvalidTextRepresentation:错误:整数输入语法无效:

    我遇到了一个奇怪的错误 希望有人能指出我正确的方向 我有一个名为 组织 的模型和一个名为 组织 的属性department 请参阅下面的架构摘录 t integer department default 0 在我的模型内部已经定义了这个属性
  • RVM 要求错误

    我安装了 OS X Mavericks 并且正在尝试运行rvm requirements在终端中 它给了我这个错误 Installing required packages autoconf automake libtool pkgconf
  • 日期时间到时间转换中奇怪的 Ruby 行为

    我的目标是从 DateTime 实例获取 Time 实例 这已经在这里讨论过 但我仍然很困惑 在 Ruby 中与日期时间和时间相互转换 https stackoverflow com questions 279769 convert to
  • 红宝石和:符号

    我刚刚开始使用 Ruby 正在阅读 Programming Ruby 1 9 The Pragmatic Programmer s Guide 我遇到过一种叫做符号的东西 但作为一名 PHP 开发人员 我不明白它们的作用和用途 谁能帮我解决
  • rspec Rails 测试:如何强制 ActiveJob 作业内联运行某些测试?

    我希望我的后台作业能够内联运行某些标记的测试 我可以通过包装测试来做到这一点perform enqueued do但我希望能够用元数据标记它们 并且如果可能的话 它会自动发生 我尝试过以下方法 it does everything in t
  • puma 初始化程序不适用于 Rails 4.2

    我之前安装过很多次puma 从来没有出现过这个问题 我逐字遵循heroku 的指示 我创建了一个Procfile里面有这个 web bundle exec puma C config puma rb 这是配置文件 puma rb worke
  • Rails - 查找多个数组之间的交集

    我正在尝试查找多个数组之间的交集值 例如 code1 1 2 3 code2 2 3 4 code3 0 2 6 所以结果是 2 我知道在 PHP 中你可以使用 array intersect 来做到这一点 我希望能够轻松添加额外的数组 所
  • EventMachine 的优势是什么

    这是我的测试用例 我发现EM并不比一般的TCP服务器快 EM 服务器 require rubygems require benchmark require eventmachine class Handler lt EventMachine
  • 为什么 ruby​​ 与字符串数组并行赋值返回字符串

    我不确定下面的代码片段到底发生了什么 gt gt a b ho hey gt ho hey gt gt a gt ho gt gt b gt hey gt gt c d foo bar gt foo bar gt gt c gt foo g
  • Rails 资产管道不包括 application.js 清单中所需的文件

    Rails 资产管道不包含 application js 中所需的文件 呈现给浏览器的唯一 javascript 文件是 application js 并且 require 行未编译为包含应有的标签 This is a manifest f
  • 减少哈希值

    我在使用reduce 语法时遇到了问题 我有以下格式的哈希 H Key1 gt 1 Key2 gt 2 我想使用reduce 来查找该函数中值的总和 就像是 H reduce 0 memo elem memo elem 我知道这是错误的 我

随机推荐