可以对instance_eval进行咖喱处理吗?

约翰·莱德贝特

假设我有一个这样的类:

class Test
  def test_func
    140
  end
end

还有一个proc,它引用来自的成员函数Test

p = ->(x, y) { x + y + test_func }  # => #<Proc:0x007fb3143e7f78@(pry):6 (lambda)>

要调用p,我将其绑定到以下实例Test

test = Test.new                     # => #<Test:0x007fb3143c5a68>
test.instance_exec(1, 2, &p)        # => 143

现在,假设我只想传递yp,并且始终传递x = 1

curried = p.curry[1]                # => #<Proc:0x007fb3142be070 (lambda)>

理想情况下,我应该能够instance_exec像以前一样,但是:

test.instance_exec(2, &curried)

=> NameError: undefined local variable or method `test_func' for main:Object

proc运行在似乎是不正确的绑定中。是什么赋予了?

西蒙沃

是的,我相信这是一个错误。

我认为可以归结为curry返回“ C level proc”而不是正常proc的事实我还不完全了解两者之间的区别(我猜前者是由Ruby C代码创建的,而后者curry确实是这样做的),但是当您尝试进行绑定时,您可以告诉他们它们是不同的。

p.binding # => #<Binding:0x000000020b4238>
curried.binding # => ArgumentError: Can't create a binding from C level Proc

通过查看源代码,看起来它们的内部结构表示形式对该iseq成员具有不同的值,该值表示此块保留什么样的指令序列。

当您调用时instance_exec这很重要,它最终最终invoke_block_from_cvm.c中进行调用,该调用根据iseq类型而分支

else if (BUILTIN_TYPE(block->iseq) != T_NODE) {
    ...
} else {
    return vm_yield_with_cfunc(th, block, self, argc, argv, blockptr);
}

我错过的分支(...)最终vm_push_frame以看起来像某个环境的调用,而vm_yield_with_cfunc没有。

因此,我的猜测是,因为咖喱的proc是用C代码创建的,并且结局的类型与您的第一个proc不同,所以上面的代码段采用了另一个分支,并且不使用环境。

我要指出的是,这一切是相当投机基于阅读的代码,我没有运行任何测试或尝试新鲜事物出来(我也不会全部是熟悉内部红宝石反正!)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

可以对标准运算符进行元组或咖喱处理吗?

来自分类Dev

使用instance_eval进行Ruby改进

来自分类Dev

可以对Knockout.js组件进行多态处理吗?

来自分类Dev

params [key] .instance_eval Ruby解释吗?

来自分类Dev

`instance_eval`和范围

来自分类Dev

剂量self.class.class_eval等于instance_eval吗?

来自分类Dev

剂量self.class.class_eval等于instance_eval吗?

来自分类Dev

我可以对图像进行动画处理吗iOS8 LaunchScreen.xib

来自分类Dev

模糊的mandlebrot功能-有人可以对其进行模糊处理吗?

来自分类Dev

我们可以对批处理进行窗口化吗?

来自分类Dev

可以对DataFrame进行“反向索引”吗?

来自分类Dev

您可以对软盘进行分区吗?

来自分类Dev

可以对WebSocket消息进行编码吗?

来自分类Dev

可以对MagicMock对象进行迭代吗?

来自分类Dev

使用instance_eval的Ruby Block Scope

来自分类Dev

instance_eval在实例方法中的行为

来自分类Dev

仅在KML(Google地球之旅)中可以对KML地标进行动画处理并进行描述吗?

来自分类Dev

可以对BERT进行微调以进行转发预测吗?

来自分类Dev

我可以对Chrome中“ overflow:scroll” div上的“滚动重绘”警告进行任何处理吗

来自分类Dev

Javascript Workers-为什么最近才对worker消息进行处理,我可以对此采取措施吗?

来自分类Dev

我可以对在GL_TRIANGLE_STRIP模式下渲染的多维数据集进行纹理处理吗?

来自分类Dev

Linux:是否可以对共享库代码进行沙箱处理

来自分类Dev

是否可以对path.Data进行动画处理

来自分类Dev

可以对类型或非类型进行模板化吗?

来自分类Dev

可以对该函数进行垃圾回收吗?

来自分类Dev

您可以对代码段表进行排序吗?

来自分类Dev

我可以对引用元组的向量进行排序吗?

来自分类Dev

可以对两个整数进行XOR运算吗?

来自分类Dev

可以对RANSAC进行改进以消除异常值吗?

Related 相关文章

  1. 1

    可以对标准运算符进行元组或咖喱处理吗?

  2. 2

    使用instance_eval进行Ruby改进

  3. 3

    可以对Knockout.js组件进行多态处理吗?

  4. 4

    params [key] .instance_eval Ruby解释吗?

  5. 5

    `instance_eval`和范围

  6. 6

    剂量self.class.class_eval等于instance_eval吗?

  7. 7

    剂量self.class.class_eval等于instance_eval吗?

  8. 8

    我可以对图像进行动画处理吗iOS8 LaunchScreen.xib

  9. 9

    模糊的mandlebrot功能-有人可以对其进行模糊处理吗?

  10. 10

    我们可以对批处理进行窗口化吗?

  11. 11

    可以对DataFrame进行“反向索引”吗?

  12. 12

    您可以对软盘进行分区吗?

  13. 13

    可以对WebSocket消息进行编码吗?

  14. 14

    可以对MagicMock对象进行迭代吗?

  15. 15

    使用instance_eval的Ruby Block Scope

  16. 16

    instance_eval在实例方法中的行为

  17. 17

    仅在KML(Google地球之旅)中可以对KML地标进行动画处理并进行描述吗?

  18. 18

    可以对BERT进行微调以进行转发预测吗?

  19. 19

    我可以对Chrome中“ overflow:scroll” div上的“滚动重绘”警告进行任何处理吗

  20. 20

    Javascript Workers-为什么最近才对worker消息进行处理,我可以对此采取措施吗?

  21. 21

    我可以对在GL_TRIANGLE_STRIP模式下渲染的多维数据集进行纹理处理吗?

  22. 22

    Linux:是否可以对共享库代码进行沙箱处理

  23. 23

    是否可以对path.Data进行动画处理

  24. 24

    可以对类型或非类型进行模板化吗?

  25. 25

    可以对该函数进行垃圾回收吗?

  26. 26

    您可以对代码段表进行排序吗?

  27. 27

    我可以对引用元组的向量进行排序吗?

  28. 28

    可以对两个整数进行XOR运算吗?

  29. 29

    可以对RANSAC进行改进以消除异常值吗?

热门标签

归档