Учитывая, насколько выразителен Ruby, мне интересно, пытался ли кто-нибудь когда-либо создавать класс или модуль, имитирующий синтаксис объекта JS. Например, в JS я могу, конечно, сделать это:
[1] var obj = {a: 'b'};
[2] obj.c = 'd';
[3] obj.a = 123
[4] obj['e'] = 'f';
[5] obj.e = obj['a']
В Ruby у меня теперь есть код, который позволит мне сделать что-то вроде этого:
[1] obj = {'a' => 'b'}.to_js
[2] # obj.c = 'd' << This is what I can't solve, 'c' is first defined here.
[3] obj.a = 123;
[4] obj['e'] = 'f'
[5] obj.e = obj['a']
Пока я получаю символ в квадратных скобках или при инициализации, я могу легко хранить пару K / V и создавать instance methods
для сеттеров и геттеров.
Тем не менее, я не смог выяснить, как создать объект, который будет отвечать на 'c', если он не определен, а затем сделать немного магии. Например,
- Я могу перебирать входящий хеш и устанавливать методы доступа
- Я могу использовать
[]=(k, v)
для обозначения в скобках и делать то же самое.
Мой прогресс во втором стиле до этого момента.
Есть очень специфический Object#respond_to_missing?
, который может принимать определенный символ в нем; но не может ответить в общем случае.
Существует три возможных способа решения закомментированного второго стиля вызова:
- Сделать объект не экземпляром класса, а методом всегда. Например, следующие работы:
class A
def b; puts 'c'; end
end
def always
A.new
end
c = always
c.b
Учитывая это, может быть возможен способ сделать какую-то ловушку ошибок и затем подключить объект соответствующим образом.
Используйте фантастическую рубиновую функцию, о которой я не слышал. Ruby - такой богатый язык, это уже может быть довольно легко.
Как-то переопределить механику обработки ошибок. Я понятия не имею, как кто-то будет делать это в большом общем случае, но, по сути, вы бы сказали ruby, что если какой-либо экземпляр какого-либо класса не сможет ответить на метод, у вас будет какой-то обобщенный обработчик, с которым придется иметь дело. вещи.
В любом случае, если у кого-то есть идея, я думаю, это было бы довольно забавное упражнение Спасибо!