LINUX.ORG.RU

История изменений

Исправление 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 должно употребляться строго внутри пакета?

опять, если я правильно понимаю, ты можешь попытаться спасти ситуацию, если сделаешь *все* операторы твоего объекта перегружамыми «снаружи» пакета через вызовы каких-то функций из твоего пакета; т.е. та простая реализация, что ты привел — не подходит

з.ы. по другим твоим постам тоже будет ответ