Метапрограммирование Ruby, как делает RSpec's, 'должно' работать?

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

Кто-то мог дать руку, как meta природа этой функции работает?

Код расположен здесь:

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

TIA,

- daniel

Разъяснение:

target.should == 5

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

13
задан Bryan Ash 24 July 2016 в 15:49
поделиться

1 ответ

Взгляните на класс OperatorMatcher .

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

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

То есть отправить сообщение должен объекту target , а затем отправить сообщение == куда угодно ] должен вернуться.

Метод должен обезьяно пропатчен в ядро ​​, поэтому он может быть получен любым объектом. Сопоставитель , возвращаемый , должен содержать фактическое , которым в данном случае является цель .

Matcher реализует метод == , который выполняет сравнение с ожидаемым , которое в данном случае является числом 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!
27
ответ дан 1 December 2019 в 21:11
поделиться