Как создать объект, который возвращает разные значения в разных скалярных контекстах?

StackOverflow https://stackoverflow.com/questions/800436

  •  03-07-2019
  •  | 
  •  

Вопрос

Я хочу вернуть другое значение в строковом и числовом контексте, например $! делает.Я знаю, что могу узнать, нахожусь ли я в списочном или скалярном контексте с помощью Wantarray, но есть ли способ в чистом Perl определить, в каком скалярном контексте я нахожусь?Я предполагаю, что в XS также есть ответ, и я готов принять этот ответ, если нет возможности сделать это на чистом Perl.

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

Решение

Проверьте Scalar::Util модуль, в частности dualvar() функция:

use Scalar::Util qw(dualvar);

my $scalar = dualvar 10, "Hello";
my $twelve = $scalar + 2;          # $twelve = 12
my $greeting = $scalar . " world"; # $greeting = "Hello world"

Scalar::Util является частью основного дистрибутива и должен быть доступен везде, где есть Perl.

Другие советы

Хотя я могу предложить случаи, когда это будет полезно (возможно, римские цифры), вам лучше создать объект с целым числом и строковым атрибутом.Используйте соответствующий атрибут в соответствующем контексте.

Это дает вам дополнительную гибкость, позволяя перегружать операции с помощью «использовать перегрузку».В примере с римскими цифрами функция Dualvar будет работать до тех пор, пока вы не захотите сложить две римские цифры вместе.

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