У меня есть класс Foo. Я хочу иметь возможность передать конструктору экземпляр Foo, foo и вернуть тот же экземпляр.
Другими словами, я хочу пройти этот тест:
class Foo; end
foo = Foo.new
bar = Foo.new(foo)
assert_equal foo, bar
Кто-нибудь знает, как я могу это сделать? Я пробовал это:
class Foo
def initialize(arg = nil)
return arg if arg
end
end
foo = Foo.new
bar = Foo.new(foo)
assert_equal foo, bar # => fails
но это не сработает.
Справка
ИЗМЕНИТЬ
Потому что многие люди просили мое обоснование:
Я делаю быстрый анализ большого количества данных (много TB), и у меня будет много примеров множества объектов. Для некоторых из этих объектов нет смысла иметь два разных экземпляра с одними и теми же данными. Например, одним из таких объектов является объект "окно" (как в временном окне), который имеет два свойства: время начала и время окончания. Я хочу иметь возможность использовать конструктор любым из этих способов и вернуть объект окна:
window = Window.new(time_a, time_b)
window = Window.new([time_a, time_b])
window = Window.new(seconds_since_epoch_a, seconds_since_epoch_b)
window = Window.new(window_obj)
window = Window.new(end => time_b, start => time_a)
...
Некоторый другой объект, который нуждается в окне, может быть создан таким образом:
obj = SomeObj.new(data => my_data, window => window_arg)
Я не обязательно знаю, что в window_arg, и мне все равно - он примет любой единственный аргумент, который может быть интерпретирован конструктором Window. Если у вас уже есть экземпляр Window, я бы скорее использовал этот экземпляр. Но работа по интерпретации выглядит как проблема конструктора Window. Во всяком случае, как я уже упоминал, я собираю много TB данных и создаю много примеров вещей. Если объект окна передается, я хочу, чтобы он просто был распознан как объект окна и использовался.