Чтобы добавить к ответу Джоша Дэвида Миллера, следующие значения считаются ложными в угловых значениях.
1) Пустой массив
2) Пустая строка // Даже пробел считается истинным
3) Логическое значение с ложным
4) неопределенное
5) null
6) 0
Таким образом, ответ Дэвида можно записать в виде
<div ng-show="items.length">
<div ng-repeat="item in items">
<!-- ... -->
</div>
</div>
или даже короче,
<div ng-show="items">
<div ng-repeat="item in items">
<!-- ... -->
</div>
</div>
С разработанным вами дизайном кажется, что самое простое решение - предоставить Crawler метод модуля, который возвращает модуль ivar.
module Crawler
def self.logger
@logger
end
def self.logger=(logger)
@logger = logger
end
end
Или вы можете использовать класс " << self
magic "если хотите:
module Crawler
class <<self
attr_accessor :logger
end
end
Он делает то же самое.
Возможно, это какая-то странная магия Ruby, которая позволит вам избежать этого, но есть довольно простое решение, которое не требует странностей. Просто поместите регистратор в модуль и получите к нему прямой доступ с механизмом для его настройки. Если вы хотите быть спокойным, определите «ленивый регистратор», который хранит флаг, чтобы сказать, есть ли у него регистратор, и либо молча отбрасывает сообщения, пока регистратор не будет установлен, либо выдает исключение, что что-то регистрируется до того, как регистратор установить или добавить сообщение журнала в список, чтобы его можно было регистрировать после определения регистратора.
Небольшой кусок кода, демонстрирующий, как это работает. Я просто создаю новый базовый объект, чтобы видеть, что object_id остается неизменным на протяжении всех вызовов:
module M
class << self
attr_accessor :logger
end
@logger = nil
class C
def initialize
puts "C.initialize, before setting M.logger: #{M.logger.object_id}"
M.logger = Object.new
puts "C.initialize, after setting M.logger: #{M.logger.object_id}"
@base = D.new
end
end
class D
def initialize
puts "D.initialize M.logger: #{M.logger.object_id}"
end
end
end
puts "M.logger (before C.new): #{M.logger.object_id}"
engine = M::C.new
puts "M.logger (after C.new): #{M.logger.object_id}"
Вывод этого кода выглядит так ( object_id
из 4 означает nil
):
M.logger (before C.new): 4
C.initialize, before setting M.logger: 4
C.initialize, after setting M.logger: 59360
D.initialize M.logger: 59360
M.logger (after C.new): 59360
Спасибо за помощь, ребята!
Как насчет того, чтобы обернуть регистратор в синглтон, тогда вы могли бы получить к нему доступ с помощью MyLogger .instance