Вопрос

Если бы у меня был простой связанный скалярный класс, который увеличивается каждый раз при чтении, я мог бы сделать это следующим образом:

родовое слово

Однако, чтобы создать переменную счетчика, я должен использовать tie.Я мог создать один счетчик и экспортировать его.Но что я действительно хочу сделать, так это сделать так, чтобы он выглядел как объектно ориентированный.Кажется, я мог бы создать метод new следующим образом:

родовое слово

тогда в моем основном скрипте получим два счетчика, выполнив:

родовое слово

Я предполагаю, что это не сработает, потому что галстук не переживает копию (я читал это где-то в документации), просто нет способа сделать это?

NB.Я знаю, что это всего лишь вопрос стиля, но это выглядело бы более правильным для глаз.

Это было полезно?

Решение

Связывающая магия не распространяется на присвоение, потому что она применяется к самой переменной, а не к ее значению. У вас есть несколько вариантов:

Возврат ссылки:

родовое слово

Назначение глобу:

родовое слово

Или вы можете передать переменную в конструктор:

родовое слово

Вы даже можете создать конструктор, который работает с обоими методами:

родовое слово

В последних двух примерах tie передается напрямую $_[0]. Причина этого в том, что элементы @_ являются псевдонимами для списка аргументов, поэтому он работает так, как если бы вы набрали my $counter в строке tie.


И, наконец, хотя ваш пример очень ясен и соответствует лучшим практикам, в духе TIMTOWTDI вы можете написать весь свой класс следующим образом:

родовое слово

И последнее, о чем стоит упомянуть. Хотя ваш вопрос касается связанных переменных, вы также можете использовать для этого перегрузку:

родовое слово

Но вы теряете возможность сбросить счетчик через присвоение. Вы можете добавить метод sub set {$_[0][0] = $_[1]} к Counter.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top