0
У меня есть этот класс:параметров method_missing Рубиновых
class Mock
attr_accessor :implementations
def initialize()
@implementations = Array.new
end
def method_missing(method_name, *arguments, &block)
implementation = findImplementation(method_name, arguments)
if implementation.nil?
raise "Undefined method #{method_name}."
else
puts "Implemented Method!"
end
end
def implement_method(method_name, parameters, return_value)
@implementations.unshift(Implementation.new(method_name, parameters, return_value))
@method_to_mock = nil
@parameter = nil
@return_value = nil
end
def findImplementation(method_name, args)
return @implementations.find { |i| i.method_name == method_name && i.parameters == args }
end
end
Если я делаю:
m = Mock.new
m.implement_method(:something, 10, true)
m.findImplementation(:something, 10)
Он возвращает реализацию я добавил во второй строке. Но когда я это делаю:
m.something(10)
Он выводит «Неопределенный метод». По-видимому, вызов findImplementation, который я делаю внутри метода method_missing, возвращает nil. Что я делаю не так?
делает вашу 'find' работу? Когда вы 'binding.pry' в' implement_method' после unshifting, это там? Начать отладку! :) Несвязанный, но это должно быть 'find_implementation'. –
'* argumentss' создаст' Array', вероятно, поэтому он возвращает 'nil', потому что он не может найти« Реализация »с параметрами' [10] ', потому что вы хотите найти его с параметрами' 10'. Не уверен, что вы пытаетесь выполнить, поэтому ответ будет малопригодным, но в этом проблема. – engineersmnky
@engineersmnky да его проблема, как я могу решить ее, чтобы сделать эти ценности сравнимыми? – Alan