#ruby #class-constants
#ruby #класс-константы
Вопрос:
Один из моих классов ruby извлекает данные из довольно большого локального XML-файла, который будет меняться только при новом развертывании.
В этом случае лучше всего сохранить документ как константу, например:
class Product
XML_DOC = Nokogiri::XML(open("#{Rails.root}/myxmlfile.xml"))
end
или для доступа к документу через метод класса, например:
class Product
self.xml_doc
Nokogiri::XML(open("#{Rails.root}/myxmlfile.xml"))
end
end
Я думаю, что метод класса может быть правильным решением, поскольку его будет легче имитировать в тестах, но что считается лучшей практикой для хранения такого файла в памяти?
Комментарии:
1. Мне нравится ответ Джоэла на ваш конкретный вопрос, но мне не нравится ваш вопрос. 🙂 Скорее создайте экземпляр объекта product как часть настройки программы. «Мне нужен только один» не является веской причиной выбрасывать ориентацию объекта из окна.
Ответ №1:
Это наиболее распространенная идиома:
class Product
def xml_doc
@@xml_doc ||= Nokogiri::XML(open("#{Rails.root}/myxmlfile.xml"))
return @@xml_doc
end
end
||=
Оператор говорит: «если переменная есть nil
, вычислите результат выражения и сохраните его, в противном случае ничего не делайте». Эта идиома называется «запоминание».
Не думайте о константах как о способе оптимизации вашего кода, в Ruby они все равно не являются постоянными.
Комментарии:
1. вы можете удалить вторую строку с возвратом, она не нужна.
2. В зависимости от вашей реализации Ruby, неявный возврат может быть быстрее.