Рубиновое метапрограммирование, как работает RSpec?

Я читал на RSpec, и я пытался понять, как RSpec "должен" был реализован.

Может ли кто-нибудь дать понять, как мета-характер этой функции работает?

Код находится здесь:

http://github.com/dchelimsky/rspec/blob/master/lib/spec/expectations/extensions/kernel.rb

ТИА,

-daniel

Уточнение:

target.should == 5

Как было передано целевое значение вместе с "should", которое в свою очередь было "==" 'd против 5?

Ответы

Ответ 1

Посмотрите класс OperatorMatcher.

Все сводится к Ruby, что позволяет вам не учитывать периоды и круглые скобки. На самом деле вы пишете:

target.should.send(:==, 5)

То есть, отправьте сообщение should объекту target, затем отправьте сообщение == на все should.

Метод should - обезьяна, заправленная в Kernel, поэтому ее можно получить любым объектом. Matcher, возвращаемый should, содержит actual, который в этом случае равен target.

Matcher реализует метод ==, который выполняет сравнение с expected, которое в этом случае является числом 5. Пример вырезания, который вы можете попробовать самостоятельно:

module Kernel
  def should
    Matcher.new(self)
  end
end

class Matcher
  def initialize(actual)
    @actual = actual
  end

  def == expected
    if @actual == expected
      puts "Hurrah!"
    else
      puts "Booo!"
    end
  end
end

target = 4
target.should == 5
=> Booo!

target = 5
target.should == 5
=> Hurrah!