Что корректный путь состоит в том, чтобы записать шаблону "одиночка" в Ruby?

Параллелизм имеет несколько потоков выполнения для данного процесса. На сегодняшний день C++ непосредственно не поддерживает его. Однако несколько библиотек существуют, который свяжет заданную функцию с новым потоком выполнения. Стандарт Unix является pthreads библиотекой.

26
задан Nakilon 28 April 2014 в 00:08
поделиться

3 ответа

# require singleton lib
require 'singleton'
class AppConfig
  # mixin the singleton module
  include Singleton
  # do the actual app configuration
  def load_config(file)
    # do your work here
    puts "Application configuration file was loaded from file: #{file}"
  end
end

conf1 = AppConfig.instance
conf1.load_config "/home/khelll/conf.yml"
#=>Application configuration file was loaded from file: /home/khelll/conf.yml
conf2 = AppConfig.instance
puts conf1 == conf2
#=>true
# notice the following 2 lines won’t work
AppConfig.new rescue(puts $!)
#=> new method is private
# dup won’t work
conf1.dup rescue(puts $!)
#=>private method `new’ called for AppConfig:Class
#=>can’t dup instance of singleton AppConfig

Так что же делает ruby, когда вы включаете одноэлементный модуль в свой класс?

  1. Он делает метод new закрытым, и вы не можете его использовать.
  2. Он добавляет метод класса под названием instance, который создает только один экземпляр класса.

Итак, чтобы использовать модуль синглтона ruby, вам нужны две вещи:

  1. Требовать синглтон lib , затем включить его в желаемый класс.
  2. Используйте метод instance , чтобы получить нужный вам экземпляр.
43
ответ дан 28 November 2019 в 06:31
поделиться
require 'singleton'
class Klass
    include Singleton
    # ...
end

См. Стандартная библиотека Ruby Документация по классу Singleton для объяснения.

8
ответ дан 28 November 2019 в 06:31
поделиться

Если вы хотите создать синглтон, зачем вообще создавать класс? Просто создайте объект и добавьте к нему нужные методы и переменные экземпляра.

>> MySingleton = Object.new
=> #<Object:0x100390318>
>> MySingleton.instance_eval do
?>   @count = 0
>>   def next
>>     @count += 1
>>   end
>> end
=> nil
>> MySingleton.next
=> 1
>> MySingleton.next
=> 2
>> MySingleton.next
=> 3

Более стандартный способ реализации этого шаблона - использование модуля в качестве одноэлементного объекта (а не более общего Объект ):

>> module OtherSingleton
>>   @index = -1
>>   @colors = %w{ red green blue }
>>   def self.change
>>     @colors[(@index += 1) % @colors.size]
>>   end
>> end
=> nil
>> OtherSingleton.change
=> "red"
>> OtherSingleton.change
=> "green"
>> OtherSingleton.change
=> "blue"
>> OtherSingleton.change
=> "red"

Если вы хотите, чтобы ваш одноэлементный объект унаследовал от некоторого класса, просто сделайте его экземпляром этого класса. Чтобы наследовать от примеси, просто используйте #extend . Если вам нужен одноэлементный объект, Ruby делает его действительно простым и, в отличие от других языков, его не нужно определять в классе.

Специальные синглтоны (мой первый пример) встречаются повсюду и охватывают большинство случаев, с которыми я сталкивался.

17
ответ дан 28 November 2019 в 06:31
поделиться
Другие вопросы по тегам:

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