Ruby - экземпляр регистратора доли среди модуля/классов

Чтобы добавить к ответу Джоша Дэвида Миллера, следующие значения считаются ложными в угловых значениях.

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>
46
задан Rob Cameron 27 May 2009 в 08:23
поделиться

4 ответа

С разработанным вами дизайном кажется, что самое простое решение - предоставить 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

Он делает то же самое.

22
ответ дан 7 November 2019 в 13:45
поделиться

Возможно, это какая-то странная магия Ruby, которая позволит вам избежать этого, но есть довольно простое решение, которое не требует странностей. Просто поместите регистратор в модуль и получите к нему прямой доступ с механизмом для его настройки. Если вы хотите быть спокойным, определите «ленивый регистратор», который хранит флаг, чтобы сказать, есть ли у него регистратор, и либо молча отбрасывает сообщения, пока регистратор не будет установлен, либо выдает исключение, что что-то регистрируется до того, как регистратор установить или добавить сообщение журнала в список, чтобы его можно было регистрировать после определения регистратора.

2
ответ дан 7 November 2019 в 13:45
поделиться

Небольшой кусок кода, демонстрирующий, как это работает. Я просто создаю новый базовый объект, чтобы видеть, что 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

Спасибо за помощь, ребята!

2
ответ дан 7 November 2019 в 13:45
поделиться

Как насчет того, чтобы обернуть регистратор в синглтон, тогда вы могли бы получить к нему доступ с помощью MyLogger .instance

1
ответ дан 7 November 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: