add_definitions существует в CMake с тех пор, как самая первая сборка CMake была запущена более десяти лет назад.
COMPILE_DEFINITIONS - это просто более новый, более гибкий и детальный способ сделать это.
Они всегда будут рядом: поскольку более 99% существующих в мире файлов CMakeLists используют add_definitions, было бы неразумно удалять его. Разработчики CMake очень стараются поддерживать обратную совместимость ... иногда в ущерб ясности и простоте. И иногда делать по существу одно и то же разными способами.
Итак: add_definitions прежде всего полезен для настройки уже существующих файлов CMakeLists - для тех проектов, которые существовали до появления COMPILE_DEFINITIONS. И, поскольку эти проекты используют его, любые новые проекты, основанные на том, что люди узнают из чтения этих файлов CMakeLists, также вполне могут использовать add_definitions.
Но если одного использования COMPILE_DEFINITIONS достаточно для ваших нужд, в этом нет ничего плохого.
Иногда процесс снижения скорости обучения с течением времени называется «отжигом» скорости обучения.
Существует много возможных «графиков отжига», например, когда скорость обучения является линейной функцией времени:
u(t) = c / t
... где c
некоторая константа. Или есть расписание «поиск-затем-схождение»:
u(t) = A * (1 + (c/A)*(t/T)) /
(1 + (c/A)*(t/T) + T*(t^2)/(T^2))
... которое поддерживает скорость обучения около A
, когда t
мало по сравнению с T
] (фаза «поиска»), а затем снижает скорость обучения, когда t
велико по сравнению с T
(фаза «схождения»). Конечно, для обоих этих подходов вам необходимо настроить параметры (например, c
, A
или T
), но мы надеемся, что их внедрение поможет больше, чем поможет причинить боль. :
в рельсах 2.3.3 была введена ошибка в ActionMailer. Билет можно посмотреть здесь Билет № 2340 . Он разрешен в 2-3-стабильном и мастер-классах, поэтому будет исправлен в 3.x и 2.3.6.
Для исправления проблемы в 2.3.* можно использовать код, предоставленный в комментариях к билету:
module ActionMailer
class Base
def perform_delivery_smtp(mail)
destinations = mail.destinations
mail.ready_to_send
sender = (mail['return-path'] && mail['return-path'].spec) || Array(mail.from).first
smtp = Net::SMTP.new(smtp_settings[:address], smtp_settings[:port])
smtp.enable_starttls_auto if smtp_settings[:enable_starttls_auto] && smtp.respond_to?(:enable_starttls_auto)
smtp.start(smtp_settings[:domain], smtp_settings[:user_name], smtp_settings[:password],
smtp_settings[:authentication]) do |smtp|
smtp.sendmail(mail.encoded, sender, destinations)
end
end
end
end
Еще один раздражающий аспект, по крайней мере в новом формате AR, - помнить, что 'default' вызывается на уровне класса. Ссылки на процедуры, которые предназначены только для экземпляров, приводят к тому, что при попытке их использования они тихо отказывают и выдают:
NoMethodError: undefined method `new_post' for Notifier:Class
Вот что я в итоге использовал:
def self.named_email(name,email) "\"#{name}\" <#{email}>" end
default :from => named_email(user.name, user.email)