Что такое «stringification» в Perl? - PullRequest
25 голосов
/ 07 марта 2011

В документации по модулю CPAN DateTime я обнаружил следующее:

После настройки форматера перегруженный метод классификации используйте форматтер.

Кажется, есть некоторая концепция Perl, называемая "stringification", которую я как-то пропустил. Поиск в Google мало что прояснил. Что это за «строчка»?

Ответы [ 3 ]

50 голосов
/ 07 марта 2011

«stringification» происходит всякий раз, когда perl необходимо преобразовать значение в строку.Это может быть его печать, конкатенация с другой строкой, применение к ней регулярного выражения или использование любых других функций манипуляции со строками в Perl.

say $obj;
say "object is: $obj";
if ($obj =~ /xyz/) {...}
say join ', ' => $obj, $obj2, $obj3;
if (length $obj > 10) {...}
$hash{$obj}++;
...

Обычно объекты преобразуются в нечтокак Some::Package=HASH(0x467fbc), где perl печатает пакет, в который он был помещен, а также тип и адрес ссылки.

Некоторые модули предпочитают переопределять это поведение.В Perl это делается с помощью прагмы overload .Вот пример объекта, который при строковом преобразовании выдает свою сумму:

{package Sum;
    use List::Util ();

    sub new {my $class = shift; bless [@_] => $class}

    use overload fallback => 1,
        '""' => sub {List::Util::sum @{$_[0]}}; 

    sub add {push @{$_[0]}, @_[1 .. $#_]}
}

my $sum = Sum->new(1 .. 10);

say ref $sum; # prints 'Sum'
say $sum;     # prints '55'
$sum->add(100, 1000);
say $sum;     # prints '1155'

Есть несколько других признаков, которые overload позволяет вам определить:

'bool' Boolification    The value in boolean context   `if ($obj) {...}`
'""'   Stringification  The value in string context    `say $obj; length $obj`
'0+'   Numification     The value in numeric context   `say $obj + 1;`
'qr'   Regexification   The value when used as a regex `if ($str =~ /$obj/)`

Объекты могут вести себя какразные типы:

'${}'   Scalarification   The value as a scalar ref `say $$obj`
'@{}'   Arrayification    The value as an array ref `say for @$obj;`
'%{}'   Hashification     The value as a hash ref   `say for keys %$obj;`
'&{}'   Codeification     The value as a code ref   `say $obj->(1, 2, 3);`
'*{}'   Globification     The value as a glob ref   `say *$obj;`
7 голосов
/ 07 марта 2011

Методы Stringification вызываются, когда объект используется в контексте, где ожидается строка.Метод описывает, как представить объект в виде строки.Так, например, если вы говорите print object;, то так как print ожидает строку, она фактически передает результат метода stringify для печати. ​​

1 голос
/ 07 марта 2011

Просто добавьте к ответу выше, чтобы провести аналогию с Java ...

Очень похоже на Object.toString () в Java.Omni-присутствует по умолчанию, но может быть отменено при необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...