Так что этот метод иногда возвращает экземпляр класса Resource, а иногда возвращает «true».Метод иногда возвращает true, иногда возвращает экземпляр объекта
Кажется, я «исправил» проблему, добавив ключевое слово return, но я не уверен, почему это происходит в первую очередь. Я прошел через код с помощью отладчика RubyMine, и в обоих случаях он, похоже, придерживается одного и того же пути, но при этом возвращается другое значение.
Я только начал программировать на Ruby, так что это все для меня загадка ..
кажется, что проблема возникает только тогда, когда проверка проходит.
Несмотря на то, что это исправлено, я хотел бы получить разъяснения относительно того, почему он работает, или, возможно, почему он не работает в первую очередь.
Вот проблемный метод:
def self.create_or_update(attributes = nil, options = {}, &block)
if attributes.is_a?(Array)
attributes.collect { |attr| create_or_update(attr, options, &block) }
else
begin
object = Resource.find_by_article_id(attributes[:article_id])
object.update_attributes!(attributes, options)
rescue
object = new(attributes, options, &block)
ensure
object.save
return object # for some reason, if you just leave out the "return" keyword, sometimes it returns "true" instead of an instance of the Resource class.. ??????
end
end
end
EDIT:
Таким образом, после некоторых более отладки и говорить с моим руководителем, мы выяснили, почему она производила странное поведение.
Последнее утверждение внутри «обеспечить» не рассматривалось как возвращаемое значение, хотя это был последний оператор, который должен обрабатываться в методе. Что на самом деле получили лечение в качестве возвращаемого значения было возвращаемое значение из object.update_attributes! (Атрибуты, опционы)
Так в основном ..
def method
true
ensure
false
end
Этот метод возвращает истинный, который, кажется, контр- интуитивно понятный, поскольку «false» выполняется последним.
Кажется, что это несоответствие в спецификации языка/возвращаемом методе, не так ли?