我正在尝试创建一个小的
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 |我把.但是能够在对象中使用它会更有用,这样对象中的某些方法就会被调用,并且数组中的每个项都作为参数传递.
那么任何想法如何使绑定问题工作?
请不要同时回答“你不想这样做,因为它会让事情变得更慢”或者“你没有保存那么多字符输入,但它会使代码不那么可读” – 我知道这些事情已经. :)这更像是一种喂养我好奇心的黑客行为.只是想知道是否可能.