Как программно определить глобальную функцию внутри функции или метода?

#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, похоже, гораздо ближе для целей генерации кода.