Обязательные вызовы методов - PullRequest
1 голос
/ 26 июня 2011

Я играю с созданием DSL. Я использую http://jroller.com/rolsen/entry/building_a_dsl_in_ruby в качестве руководства.

Учитывая этот DSL:

question 'Who was the first president of the USA?'
wrong 'Fred Flintstone'
wrong 'Martha Washington'
right 'George Washington'
wrong 'George Jetson'

есть ли способ убедиться, что вопрос () вызывается хотя бы один раз, правильно () ровно один раз и неправильно () n или более раз?

Ответы [ 2 ]

3 голосов
/ 26 июня 2011

Конечно. Просто добавьте строку

(@question_count ||= 0) += 1

к тому, как выглядит ваша текущая реализация метода question (и аналогично для right и wrong), а затем проверьте эти переменные.

0 голосов
/ 26 июня 2011

Обработка ответов отсутствует в следующем коде, но вы можете контролировать только один правильный ответ

class Question
  def initialize(text)
    @text = text
    @answers = []
    @correct = nil #index of the correct answer inside @answers
  end
  def self.define(text, &block)
    raise ArgumentError, "Block missing" unless block_given?
    q = self.new(text)
    q.instance_eval(&block)    
    q
  end
  def wrong( answer )
    @answers << answer
  end
  def right(answer )
    raise "Two right answers" if @correct
    @answers << answer
    @correct = @answers.size
  end
  def ask()
    puts @text
    @answers.each_with_index{|answer, i|
      puts "\t%2i %s?" % [i+1,answer]
    }
    puts "correct is %i" % @correct
  end
end

def question( text, &block )
  raise ArgumentError, "Block missing" unless block_given?
  Question.define(text, &block)
end

Теперь вы можете определить свой вопрос с помощью синтаксиса блока:

question( 'Who was the first president of the USA?' ) {
  wrong 'Fred Flintstone'
  wrong 'Martha Washington'
  right 'George Washington'
  wrong 'George Jetson'
}.ask

Вы также можете использовать другое определение вопросов:

q = Question.new( 'Who was the first president of the USA?' )
q.wrong 'Fred Flintstone'
q.wrong 'Martha Washington'
q.right 'George Washington'
q.wrong 'George Jetson'
q.ask
...