#ruby #metaprogramming
#ruby #метапрограммирование
Вопрос:
Например,
def makeFunction name
... #define a function with the name supplied
end
makeFunction 'functionMade'
functionMade
Я знаю, что можно создать глобальную переменную $functionMade
через lambda
или proc
, но возможно ли сделать ее действительно функцией без $
префикса?
Ответ №1:
я думаю, что через class_eval
on Kernel
:
Kernel.class_eval <<-RUBY
def abc
puts 'abc'
end
RUBY
но я бы этого не рекомендовал. зачем вам это нужно, или вам просто любопытно?
Комментарии:
1. Круто! Я хочу сгенерировать набор функций, как указано во внешне загруженном JSON. 🙂
2. : D действительно! Помните, что eval — это зло
3. @albert: Вы смотрели, подойдет ли вам Struct или OpenStruct?
4. это опасно.. вы можете случайно исправить / переопределить что-то, что встроено в Ruby.. Опасность будет Робинсон!
5. @AndrewGrimm: Я создаю генератор ассемблерного кода. Существуют сотни инструкций из таблицы данных. Я просто вставляю спецификацию, такую как
'ADC{S}<c><q> {<Rd>,} <Rn>, #<const>'
, и анализирую ее для создания функций, чтобы код Ruby выглядел как код ассемблера.adc R1, R2, 100
Это создает фактический ассемблерный код,adc R1, R2, #100
я сделал это на javascript, но Ruby, похоже, гораздо ближе для целей генерации кода.