История изменений
Исправление www_linux_org_ru, (текущая версия) :
my $o = new(1);
$o > «/proc/net/blah1»;
бугага!
ты думаешь, что кто-то согласится так писать вместо «1» > «/proc/net/blah1» ?
3 > r"/proc/bet/blah2";
pure man's solution; этим кое-как можно пользоваться, вот только имеем те же проблемы, что и со new (см. ниже), и плюс к этому проблему «букв алфавита всего лишь 26»
new(1) > «/proc/net/blah2»;
new — это убогий костыль в убогом язычке, в котором для перегрузки требуется, чтобы хотя бы один операнд оператора был объектом
есть еще один способ, который ты не указал — в перле есть возможность перегружать константы, но это (пусть меня поправят) неполное решение для данного случая — необходима работоспособность и без констант, например так
$a=<>; $b=<>; $a > "$proc/net/$b";
итак, допустим ты написал свой new, который делает из 1-цы объект, вася пупкин написал свой new, который у него называется object, и John Doe тоже написал несовместимую реализацию new, причем назвал его так же как и ты — new; далее я подключаю библиотеки, в которых юзаются все 3, и что дальше? как во всей этой каше жить?
я понимаю, если бы в перле был стандартный object-izer... он есть? где про него написано в man perl?
чуть подробнее насчет каши (твой new я буду называть obj (т.к. оbjectizer)):
в с++, хотя он и убог аналогично перлу, но возможно написать obj, который может как-то претендовать на включение в стандарт:
template<class T> struct Object {
Object(T& value): value(value) {}
T& value;
};
template<class T> Object<T> obj(const T& value) { return Object<T>(value); }
разница с твоей реализацией new в том, что у тебя *сразу* уже перегружен оператор >, в то время как у obj никаких операторов не перегружено, и перегружать их можно *модульно*, т.е. *вне* класса Object (это позволяет мне перегрузить оператор >, а скажем васе пупкину перегрузить оператор + независимо от меня, и при этом мы с ним пользуемся одним и тем же классом Object и функцией obj)
правильно ли я понимаю, что в perl это невозможно, т.к. use overload должно употребляться строго внутри пакета?
опять, если я правильно понимаю, ты можешь попытаться спасти ситуацию, если сделаешь *все* операторы твоего объекта перегружамыми «снаружи» пакета через вызовы каких-то функций из твоего пакета; т.е. та простая реализация, что ты привел — не подходит
з.ы. по другим твоим постам тоже будет ответ
Исходная версия www_linux_org_ru, :
my $o = new(1); $o > «/proc/net/blah1»;
бугага!
ты думаешь, что кто-то согласится так писать вместо «1» > «/proc/net/blah1» ?
3 > r"/proc/bet/blah2";
pure man's solution; этим кое-как можно пользоваться, вот только имеем те же проблемы, что и со new (см. ниже), и плюс к этому проблему «букв алфавита всего лишь 26»
new(1) > «/proc/net/blah2»;
new — это убогий костыль в убогом язычке, в котором для перегрузки требуется, чтобы хотя бы один операнд оператора был объектом
есть еще один способ, который ты не указал — в перле есть возможность перегружать константы, но это (пусть меня поправят) неполное решение для данного случая — необходима работоспособность и без констант, например так
$a=<>; $b=<>; $a > "$proc/net/$b";
итак, допустим ты написал свой new, который делает из 1-цы объект, вася пупкин написал свой new, который у него называется object, и John Doe тоже написал несовместимую реализацию new, причем назвал его так же как и ты — new; далее я подключаю библиотеки, в которых юзаются все 3, и что дальше? как во всей этой каше жить?
я понимаю, если бы в перле был стандартный object-izer... он есть? где про него написано в man perl?
чуть подробнее насчет каши (твой new я буду называть obj (т.к. оbjectizer)):
в с++, хотя он и убог аналогично перлу, но возможно написать obj, который может как-то претендовать на включение в стандарт:
template<class T> struct Object {
Object(T& value): value(value) {}
T& value;
};
template<class T> Object<T> obj(const T& value) { return Object<T>(value); }
разница с твоей реализацией new в том, что у тебя *сразу* уже перегружен оператор >, в то время как у obj никаких операторов не перегружено, и перегружать их можно *модульно*, т.е. *вне* класса Object (это позволяет мне перегрузить оператор >, а скажем васе пупкину перегрузить оператор + независимо от меня, и при этом мы с ним пользуемся одним и тем же классом Object и функцией obj)
правильно ли я понимаю, что в perl это невозможно, т.к. use overload должно употребляться строго внутри пакета?
опять, если я правильно понимаю, ты можешь попытаться спасти ситуацию, если сделаешь *все* операторы твоего объекта перегружамыми «снаружи» пакета через вызовы каких-то функций из твоего пакета; т.е. та простая реализация, что ты привел — не подходит
з.ы. по другим твоим постам тоже будет ответ