4

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

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

有谁知道我如何分配一个在速记 Array 实例实例化的方法链中的方法?

4

1 回答 1

2

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

这是 Ioke 中的一个示例:

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

在 Seph 中:

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

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

于 2011-11-14T10:06:00.133 回答