ruby-on-rails – 带有绑定的Ruby to_proc hack

我正在尝试创建一个小的 Ruby hack来制作类似Symbol#to_proc hack的反向. Symbol#to_proc hack使这成为可能:
some_array.each(&:some_method)

是相同的

some_array.each { |obj| obj.some_method }

我想让这成为可能:

some_array.each(&[:some_method])

会是一样的

some_array.each { |obj| some_method(obj) }

问题是除非some_method是一个内核方法,否则它的真正含义是:

some_array.each { |obj| self.some_method(obj) }

当显式传递一个块时,它会在写入这一行的绑定中创建,因此self可以正确访问当前对象,一切正常.但是,如果在Array的to_proc方法中创建块,则self在Array绑定中(并引用数组本身).也许我不可能做我想做的事,但我喜欢社区的一些想法.

到目前为止,这是我的黑客.只要该方法一个内核方法,并且在Array中可用,它就可以工作:

class Array
  def to_proc
    lambda {|i| send(self.first,i)}
  end
end

有了这个hack,这条线就可以工作了,并放了三个符号:

[:foo,:bar,:bas].each(&[:puts])

它对我来说很有用,因为我经常发现自己想要在控制台中检查一系列ActiveRecord对象,这样我就不会输入{| i |我把.但是能够在对象中使用它会更有用,这样对象中的某些方法就会被调用,并且数组中的每个项都作为参数传递.

那么任何想法如何使绑定问题工作?

请不要同时回答“你不想这样做,因为它会让事情变得更慢”或者“你没有保存那么多字符输入,但它会使代码不那么可读” – 我知道这些事情已经. :)这更像是一种喂养我好奇心的黑客行为.只是想知道是否可能.

解决方法

您正在寻找称为方法方法:)
class Example
  def some(arg)
    p arg.size # just as a demo
  end
end

obj = Example.new
%w{the quick brown fox jumps over the lazy dog}.each(&obj.method(:some))

产量

3
5
5
3
5
4
3
4
3

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...