Replies (31)

  • @iorlas, require 'singleton'
    class Test
    include Singleton
    def message(msg)
    puts msg
    end
    end
    Test.instance.message('test')
  • @iorlas, Hel_Fulton_Programmirovanie_na_yazyike_Ruby. Это стандартная фича.
  • @Yumitsu, Фууууу. Ужас какой. Я то сейчас добавляю в либу агатсумы свою версию синглтонов и плачусь от того, что там красиво сделать не получается, но после такого ужаса, который я вижу в рубях... Там точно иначе никак?
  • @wyldrodney, И как? Так как сказал юмка? Не иначе?
  • @iorlas, Ну, я, если честно, не знаю, чем тебя пугает добавка двух строчек в класс. Вообще, это какбэ стандартное решение, есть и нестандартные.
    На самом деле, я очень редко пользуюсь синглтонами — как то нет особенных причин.
  • @Yumitsu, Ну уж на то веб-дев и есть, редко приходится данный паттерн применять. Меня пугает не то, что нужно 2 строчки добавлять, а как это реализовано — в лоб.
    Я на пайтоне сейчас добиваюсь такого поведения:
    Первый вызов с аргументами — инициализация. Аргументы передаются в конструктор.
    Второй..N вызовы возвращают инстанс.
    Foo("bar").hey()
    Foo().how()
    Foo().print_arg() => "bar"
  • @iorlas, a = "hello"
    b = "goodbye"

    def b.upcase
    gsub(/(.)(.)/) { $1.upcase + $2 }
    end

    puts a.upcase #HELLO
    puts b.upcase #GoOdBye
  • @wyldrodney, Да ты наркоман! Я о синглтонах спрашиваю же.
  • @iorlas, В руби это и называет сингтонами.
  • @wyldrodney, А что конкретно они называют в том коде синглтонами?
  • @wyldrodney, А, понял
  • @iorlas, Единичный экземпляр класса с переопределённым методом.
  • @wyldrodney, Да-да, сообразил. Вообще это немного не то, чего хочется. Не тот путь для цели. На пайтоне тоже синглтоны это модули, но хочется именно класс.
  • @iorlas, А чего хочется то?
  • @wyldrodney, Хочется сделать обычный класс и чтобы каждый раз, при обращении к нему, тебе отдавался один и тот же экземпляр.
  • @iorlas, Ну тогда как сказал юмитсу.
  • @wyldrodney, Абидна сющай. А я тут, не спав часов 20, уже подумал может на руби перебраться, но нет, не судьба..
  • @iorlas, Ну, на руби это можно сделать. Записываешь аргументы в переменную класса, а потом дёргаешь её из нужных методов. Или я не понял чего именно ты хочешь.
  • @wyldrodney, Хм...
  • @wyldrodney, Я хочу так:
    class Foo(Singleton):
    ...def __init__(self, arg1):
    ......self.arg1 = arg1
    ...def print_arg(self):
    ......print self.arg1
    Foo(1)
    Foo().print_arg() => 1
  • @wyldrodney, Лучше почитай книгу, ка кпроспишься. Там офигенная глава по ООП и связанным трюкам. А мой мозг вынесен дизаайном
  • @iorlas, А Foo(2) что должен давать?
  • @wyldrodney, Вызов конструктора всегда даёт инстунс.
  • @iorlas, Т.е. можно делать так:
    class Foo(object):
    ...def __init__(self, arg1):
    ......self.arg1 = arg1
    ...def foo(self):
    ......print "Hey!", self.arg1
    ...def bar(self, arg2):
    ......print self.arg1 + arg2

    Foo(1).foo() => Hey! 1
    Foo().bar(2) => 3
  • @iorlas, Ну всё это можно накодить на руби. Не понял чем оно отличается от обычного класса. Чем должно отличаться.
  • @wyldrodney, Тем, что при вызове конструктора класса, всегда возвращается инстанс, который был создан первый раз И конструктор вызывается только первый раз.
  • @wyldrodney, Вот моя реализация класса синглтона на пайтоне:
    class Singleton(object):
    __instance = None
    def __new__(self, a, *kwa):
    if self.__instance is None:
    self.__instance = object.__new__(self)
    return self.__instance

    Используется просто:
    class Foo(Singleton):
    ...def __init__(self, arg):
    ......print arg
    ......self.arg = arg
    ...def hey(self):
    ......print self.arg + 1

    Foo(1).hey() => 1 \n 2
    Foo().hey() => 2
  • @iorlas, Ага. Пишешь суперкласс, реализующий такой поведение, и наследуешь его в синглетных классах. Никакой грязи. Только не понял нахера такое надо.
  • @wyldrodney, Чтобы всегда работать с одним инстансом. Вот пример: у тебя ядро системы. Ты создал его один раз: Foo(configs, name, path). Всё, оно создалось, никуда сохранять его не нужно!
    Когда нужно ядро, просто импортируем класс из модуля:
    from core import Foo
    И сразу получаем его инстанс: Foo()
  • @iorlas, Что мешает переопределить пару методов в твоём классе ядра? Пусть класс этим и занимается.
  • @wyldrodney, Либо я не пойму что ты имеешь ввиду, либо ты не понял моей задачи.
    Я могу делать что хочу, могу переопределять, но зачем? Какого эффекта добьюсь? Ты хочешь чтобы я в модуле создал глобальный объект, а в него вставил свои методы? Я правильно понял?