Написание DSL, как Thor Gem в Ruby? - PullRequest
2 голосов
/ 20 декабря 2010

Я пытаюсь выяснить, как Thor gem создает DSL как этот (первый пример из их README)

class App < Thor                                                 # [1]
  map "-L" => :list                                              # [2]

  desc "install APP_NAME", "install one of the available apps"   # [3]
  method_options :force => :boolean, :alias => :string           # [4]
  def install(name)
    user_alias = options[:alias]
    if options.force?
      # do something
    end
    # other code
  end

  desc "list [SEARCH]", "list all of the available apps, limited by SEARCH"
  def list(search="")
    # list everything
  end
end

В частности, как узнать, какой метод сопоставить вызовы desc и method_options?

1 Ответ

9 голосов
/ 20 декабря 2010

desc довольно легко реализовать, хитрость заключается в использовании Module.method_added:

class DescMethods
  def self.desc(m)
    @last_message = m
  end

  def self.method_added(m)
    puts "#{m} described as #{@last_message}"
  end
end

любой класс, который наследуется от DescMethods, будет иметь метод desc, такой как Thor. Для каждого метода будет напечатано сообщение с названием и описанием метода. Например:

class Test < DescMethods
  desc 'Hello world'
  def test
  end
end

когда этот класс определен, будет напечатана строка «test, описанный как Hello world».

...