Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка оператора присваивания 
:(
    Опции темы
Royan
  Дата 28.2.2012, 04:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Я решил использовать перегруженный оператор для того чтобы исполнение SQL кода происходило вместе с присваиванием, т.е. атомарно. Почему не использовал метод типа execute()? Потому что начальство считает, что это слишком громоздко. Но тут есть нюанс. Какой бы оператор я не перегрузил все равно есть вероятность что программист напишет, так:

Код

my $so = SqlObj->new();// с этой строкой всё нормально
$so = "select * from foo"; // здесь bug, т.к. оператор присваивания не перегружается
$so .= "select * from foo"; // этот код верный т.к. ".=" перегрузить можно


В общем есть способ бросать исключение, генерировать ошибку или еще что-то чтобы вариант со знаком равно не прокатывал?

Вариант с константой плохой т.к. можно забыть объявить переменную константой.


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Pfailed
Дата 28.2.2012, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Причина конечно у вас странная и способ выбран в лучших традициях обфускации.
Но если очень хочется, то можно вспомнить про функцию tie(). Эксперементальным путем был получен следующий набор костылей
Код

package ReadOnlyScalar;

use strict;
use Carp;

sub TIESCALAR {
    my ($class, $obj) = @_;
    my $self = {obj => $obj};
    bless $self, $class;
}

sub STORE {
    my $self = shift;
    if ($self->{obj}->{skipassignment}) {
        $self->{obj}->{skipassignment} = 0;
        return;
    }
    croak 'Assignment of readonly scalar';
}

sub FETCH {
    shift->{obj};
}

package Wonderful;

use Carp;
use strict;

use overload
    '.=' => sub {
        $_[0]->{skipassignment} = 1;
        $_[0]->{buff} .= $_[1];
        $_[0]->dump();
        $_[0];
    },
    fallback => 1;

sub new {
    my ($class, $ref) = @_;
    ref($ref) eq 'SCALAR' or croak "usage: new(\$scalar_ref)";
    
    my $obj = bless {}, $class;
    tie $$ref, 'ReadOnlyScalar', $obj;
    $$ref->{buff} = 'init';
}

sub dump {
    print $_[0]->{buff}, "\n";
}

package main;

Wonderful->new(\my $obj);
$obj .= "www";
$obj = "xxx";


Из минусов можно заметить своеобразное создание объектов, приходится передавать ссылку на переменную в new, иначе tie() выполнится не на нужной нам переменной. Помимо этого я не уверен, что после выхода $main::obj из области видимости объект уничтожается, надо бы проверить и возможно где-то сделать weaken(). Да и вообще это решение выглядит весьма хрупко

Это сообщение отредактировал(а) Pfailed - 28.2.2012, 11:30


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0402 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.