[...] перегрузка создания массива в Ruby - PullRequest
4 голосов
/ 14 ноября 2011

Я написал библиотеку, которая расширяет несколько базовых классов Ruby за счет наблюдения за обертками, в основном за счет псевдонимов методов.Тем не менее, я наткнулся на контрольно-пропускной пункт с сокращением экземпляра Array (например, @a = [1, 2, 3]). Кажется, я не могу найти какой-либо метод, который фактически вызывается при создании объекта Array с помощью сокращенного средства.Это не унаследованный #[] метод в текущей области или унаследованный от любого класса или модуля в цепочке предков.Я также перегружал или наблюдал за каждым методом от #new класса до #initialize экземпляра * singleton_method #[] объекта класса Array на основе кода Ruby C

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

Кто-нибудь знаетКак я могу назначить метод, который будет в цепочке методов создания экземпляра сокращенного экземпляра массива?

1 Ответ

2 голосов
/ 14 ноября 2011

К сожалению, как и почти любой другой язык программирования на планете, Ruby не допускает перегрузки литералов.Если вам требуется буквальная перегрузка, вам придется использовать один из немногих языков программирования, которые его поддерживают, например Ioke или Seph .

Вот пример в Ioke:

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

И в Seph:

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

[Обратите внимание, что это, конечно, нанесет ущерб вашей системе, так как, например, большая часть Ioke / SephСтандартная библиотека реализована в Ioke / Seph, и они повсеместно используют списки, поэтому в производственной системе вы захотите правильно инкапсулировать это.]

...