Реализация шаблона Singleton в Ruby - PullRequest
0 голосов
/ 27 июня 2011

Хотя я объявил класс FooFactory как "Singleton", его переменная класса @@ foo создается каждый раз.Почему это так?

Основной синглтон-класс:

require 'singleton'

class FooFactory
  include Singleton
  @@foo = nil

  def get_foo
    print @@foo.nil?.to_s
    @@foo  ||= "I am a string"
    return @@foo
  end
end

Код контроллера:

class PagesController < ApplicationController
  def home
    @foo = FooFactory.instance.get_foo
  end
end

Код вида:

<%= @foo %>

Я ожидаю, что метод print в FooFactory должен вернуть false после того, как FooFactory был создан впервые.Но консоль продолжает печатать true каждый раз, когда я обновляю представление pages/home.

1 Ответ

6 голосов
/ 27 июня 2011

В режиме разработки классы перезагружаются при каждом запросе, теряя любое состояние класса, которое вы, возможно, вставили в них. Это можно изменить, посмотрев эту строку в файле development.rb:

config.cache_classes = false

и изменив его на true, как это обычно устанавливается в production.rb. Причиной установки этого параметра на false является удобство: вы можете отредактировать свой код и нажать «Обновить», чтобы увидеть изменения, не перезагружая сервер.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...