2013-07-09 1 views
2

Я пытаюсь создать класс, который включает в себя модуль Singleton при использовании attr_accessor. Это, похоже, не работает.Ruby Singleton attr_accessor

require 'singleton' 

class Foo 
    attr_accessor :bar 
    include Singleton 
end 

Foo.bar = 'foobar' 

Это дает ошибку:

undefined method `bar=' for Foo:Class (NoMethodError) 

Что я делаю неправильно здесь?

+0

вы вызываете метод класса, а не метод экземпляра, который вы не реализовали. Singelton - это класс с одним единственным экземпляром. Вы должны делать вызов экземпляра, а не класса. –

ответ

4

Singleton не меняет способ attr_accessor работы. Это гарантирует, что вы можете иметь только один экземпляр. Поэтому вы должны позвонить attr_accessor в пределах eigenclass, как и обойтись без Singleton.

class Foo 
    singleton_class.class_eval{attr_accessor :bar} 
end 
+1

Спасибо. Мне действительно нравится это решение, потому что людям, которые используют мой драгоценный камень, не придется делать 'Foo.instance.blah ...' –

1

Методы определяются с использованием attr_accessors методы экземпляра, вы пытаетесь вызвать метод bar= на Foo класса, который не определяет его. Вы должны получить экземпляр Foo первого, а затем вызвать bar= на нем:

Foo.instance.bar = "whatever" 
Смежные вопросы