Подтвердить что ты не робот

Что такое "стрингция" в Perl?

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

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

Кажется, что есть концепция Perl, называемая "строение", которую я как-то пропустил. Googling не разъяснил это много. Что это за "строение"?

4b9b3361

Ответ 1

"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 прагмы. Вот пример объекта, который, когда stringified производит свою сумму:

{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;`

Ответ 2

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

Ответ 3

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

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