重载Ruby的[...]数组创建速记

时间:2011-11-14 03:15:32

标签: ruby arrays overloading method-chaining shorthand

我编写了一个扩展了几个基类Ruby类的库,主要通过方法别名来观察包装器。但是,我用数组实例化速记(例如@a = [1, 2, 3])遇到了障碍我似乎找不到任何通过速记方式在创建Array对象时实际调用的方法。它不是当前作用域中的继承#[]方法,也不是祖先链中的任何类或模块继承的方法。我还基于Ruby C代码重载或观看了类#new到实例的#initialize到Array类对象的singleton_method #[]的每个方法

rb_define_singleton_method(rb_cArray, "[]", rb_ary_s_create, -1);

有谁知道我如何分配一个方法,该方法将在速记数组实例实例化的方法链中?

1 个答案:

答案 0 :(得分:2)

不幸的是,就像地球上几乎所有其他编程语言一样,Ruby不允许重载文字。如果您需要文字重载,则必须使用少数支持它的编程语言之一,例如IokeSeph

以下是Ioke的一个例子:

[] = method(foo, foo println)
[1]
; 1

在Seph:

[] = #(foo, foo println)
[1]
; 1

[请注意,这些会对您的系统造成严重破坏,例如,因为Ioke / Seph标准库的很大一部分是在Ioke / Seph中实现的,并且它们会在整个地方使用列表,所以在生产系统中,您需要正确地封装它。]