将方法传递给迭代器方法时发生了什么

2023-12-13

众所周知,谁可以通过 a 将方法传递给迭代器方法&: prefix.
例如:

["a", "b"].map(&:upcase) #=> ["A", "B"] 
def rettwo
  2
end
["a", "b"].map(&:rettwo) #=> [2, 2]

问题是,当我编写一个方法时,传递一个方法&:前缀,我收到一条错误消息:“ArgumentError:没有给出接收者”。
让我展示一下代码:

def a_simple_method &proc
  puts proc.class # it shows `Proc`
  proc.call
end
def a_iterator_method
  puts yield
end

a_simple_method &:rettwo #=> ArgumentError: no receiver given
a_iterator_method &:rettwo #=> ArgumentError: no receiver given

我缺少什么,如何map就像数组的方法一样处理它


这是有效的。解释如下。

class String
  def rettwo
    self + self
  end
end

def a_simple_method &proc
  proc.call('a')
end

def a_iterator_method
  yield 'b'
end

a_simple_method(&:rettwo) # => "aa"
a_iterator_method(&:rettwo) # => "bb"

The &:构造称为Symbol#to_proc。它将符号变成过程。该过程需要一个接收者作为第一个参数。其余参数用于调用过程。您没有传递任何参数,因此出现“未给出接收者”错误。

以下是附加参数的演示:

class String
  def say name
    "#{self} #{name}"
  end
end

def a_simple_method &proc
  proc.call('hello', 'ruby')
end


a_simple_method(&:say) # => "hello ruby"

这是 2008 年的一些博客文章中对 Symbol#to_proc 的定义。现代的 Symbol#to_proc 似乎是用 C 实现的,但这仍然可以帮助理解。

class Symbol
  def to_proc
    Proc.new { |*args| args.shift.__send__(self, *args) }
  end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将方法传递给迭代器方法时发生了什么 的相关文章

随机推荐

  • 在 WebGL 上访问图像/纹理数据(纹素)

    我在 WebGL 上有以下代码片段 var texture gl createTexture texture image new Image texture image onload function I want to read the
  • 使用java反射获取包名称

    我想从一个单独的 Java 项目中获取所有包名称 在 Java 中如何最好使用反射来实现此操作 我已将项目导入到我的构建路径中 并尝试使用下面的代码来获取包名称 Package pack Package getPackages 编辑 我没有
  • 使用 Blogger API 获取的帖子数量限制(错误 400)

    我正在尝试使用 Blogger API 从博客中获取所有帖子 由于某些未知原因 要获取的最大帖子数似乎被限制为 20 个 如果我尝试这个网址 我收到以下回复 按预期列出最后 20 个帖子标题 items title El Caballero
  • 为什么 Bootstrap CSS 没有在其他项目中使用相同的代码覆盖?

    我有这样的问题 我正在处理项目 但是当我从服务器复制相同的文件时 它看起来有所不同 某些 Bootstrap 样式未被覆盖 这是工作站点标题的屏幕截图 以及在我的计算机上打开同一项目时看到的内容 我查看了 Firebug 发现该活动链接使用
  • UIPageViewController:pageViewController:spineLocationForInterfaceOrientation:未调用

    我的spineLocationFor InterfaceOrientation方法没有被调用 因此 脊柱总是在左边 但我想把它放在中间 我做错了什么 if UIPageViewController class self pageViewCo
  • 在CodeIgniter中检查update_batch()是否成功

    我正在 CodeIgniter 中的表上运行 update batch 我想检查它是否成功 我尝试过使用affected rows 但这只计算已修改的表单字段的数量 因此并不能完全减少它 this gt db gt update batch
  • 防止其他类实例化类

    我正在使用域 视图和控制器 每个都包含自己的类 该域包含许多不应在域外的类中实例化的类 我的印象是默认访问修饰符会对我有所帮助 使我的域类的构造函数包可见 事实证明 在导入正确的 package class 文件后 任何类仍然可以使用构造函
  • 如何让多边形填满屏幕宽度的 80%?

    我有一个简单的正方形 多边形 我希望它填充 80 屏幕宽度 换句话说 我想将正方形放置在 屏幕中央 但宽度为总宽度的80 屏幕的 我该怎么做 我找不到关于此的示例 教程 thanks 这是我的广场的代码 public class Squar
  • Fortran MPI 代码中的标准输出

    我有一个并行的 fortran 代码 其中我只希望rank 0进程能够写入标准输出 但我不想在代码中乱七八糟 if rank 0 write 所以我想知道这样做是否是一个好主意 或者是否有更好的方法 program test use mpi
  • 如何诊断 .NET Core 5 中的 CORS 问题?

    我遇到了 CORS 问题 如果我允许任何方法 任何来源和任何标头 一切都会正常工作 但当我限制其中任何一个时 浏览器控制台会立即变成红色 我已经解决了我的问题 这是由于环境变量不好 但这是一个相当乏味的试错过程 有没有办法诊断 NET Co
  • 如何使用第一个下拉列表中选定的值填充第二个下拉列表?

    假设我有两个下拉菜单 它们在我的 jsp 加载时填充
  • Java 文件下载挂起

    我有一个用于下载文件的网络界面 当请求到来时 我的 glassfish 服务器从 Web 服务流式传输文件 然后将内容写入输出流 我的代码工作正常 除非文件大小变得非常大 例如超过 200 MB 它会挂起 在浏览器中显示 0 下载 并且文件
  • 为什么在我的例子中字符串不相等?

    I have currencyFormatter那是与se SV locale var currencyFormatter NumberFormatter let formatter NumberFormatter formatter cu
  • 使用 webpack 和 bootstrap-loader 时 $(...).modal is not a function(...) 错误

    我在打开模态时遇到问题 modal id modal show 功能 在缩小问题范围后 我相信这与 webpack 加载我的依赖项或特别是 jQuery 依赖项有关 以下是我的 webpack 配置的必要部分 entry js bootst
  • Kafka Streams:如何使用 persistenceKeyValueStore 从磁盘重新加载现有消息?

    我的代码当前使用 InMemoryKeyValueStore 这避免了对磁盘或 kafka 的任何持久化 我想使用rocksdb Stores persistentKeyValueStore 以便应用程序将从磁盘重新加载状态 我正在尝试实现
  • 如何纠正 Damerau-Levenshtein 实施中的错误?

    我带着另一个较长的问题回来了 尝试过许多基于 Python 的 Damerau Levenshtein 编辑距离实现 我终于找到了下面列出的那个 as editdistance reference 它 似乎提供了正确的结果并且似乎有一个有效
  • 如何使用guard语句来检测赋值后的nil?

    我正在尝试使用 Guard 语句来检查是否为零 我很困惑为什么以下内容让它漏掉并生成 BAD EXEC 错误 guard let event Event eventsImagesLoading removeValueForKey locat
  • PDO_OCI - 进入 clob 字段

    我想在 Oracle DB 中插入一些 base64 编码的数据 每个字段最多 500 000 个字符 因为在我开始使用 PDO 并将字段设置为 CLOB 之前 我没有将 Oracle 与 PHP 一起使用 我的代码的简短版本 Db 类扩展
  • 在 Box2D 中制作漩涡

    我试图通过施加力在 C Objective C 上的 Box2D 中制作螺旋涡流 我想实现的是一个将物体从一个点推开或吸引它们的漩涡 我想我必须施加不止一种力量 我解决这个问题的切入点是 我想我必须施加三种力量 吸引或排斥身体中心的冲动 想
  • 将方法传递给迭代器方法时发生了什么

    众所周知 谁可以通过 a 将方法传递给迭代器方法 prefix 例如 a b map upcase gt A B def rettwo 2 end a b map rettwo gt 2 2 问题是 当我编写一个方法时 传递一个方法 前缀