Использование define_method для определения глобальных методов вне модуля - PullRequest
0 голосов
/ 24 декабря 2009

Я хотел бы написать это:

[:p, :h1, :h3].each do |tag|
  define_method(tag) { |text| "<#{tag}>#{text}</#{tag}>" }
end

Это всего лишь несколько простых способов обернуть текст в теги HTML. Я хочу иметь возможность использовать эти методы в остальной части сценария. К сожалению, метод define_method, похоже, работает только внутри модуля. Но если бы я делал это внутри модуля, я бы не смог написать p "This is a paragraph.", это было бы что-то вроде HTML::p "This is a paragraph.", что было бы довольно ужасно.

Так, как я могу определить методы как это глобально?

Ответы [ 3 ]

5 голосов
/ 24 декабря 2009

Если вам действительно нужно это сделать:

[:p, :h1, :h3].each do |tag|
    Object.send(:define_method, tag) { |text| "<#{tag}>#{text}</#{tag}>" }
end
3 голосов
/ 24 декабря 2009

Я не знаю всей вашей ситуации, но вы, вероятно, не очень хотите определять глобальные методы. Если вы не хотите вводить HTML::, добавьте оператор include HTML в начале вашего кода.

2 голосов
/ 24 декабря 2009

Один из способов - создать метод внутри Object, который затем будет глобальным, по вашему желанию:

class Object
  def create_method(name, &block)
    self.class.send(:define_method, name, &block)
  end
end

tag = 'p'
a = Object.new
a.create_method(tag.intern) {|v| puts "<#{tag}>#{v}</#{tag}>"}

send(tag.intern, 'content') # => <p>content</p>
...