Что происходит, когда вы помещаете массив в правую часть оператора =>? - PullRequest
2 голосов
/ 08 декабря 2009

Это может показаться глупым вопросом, но это был долгий день. Я адаптирую некоторый код Perl для другого использования, и я столкнулся с этим синтаксисом:

my @request;

#... fill the array with stuff...

my $reply = $service->call('requestMessage' => @request, $header);

Этот вызов метода кажется неправдоподобным, если => это просто особый вид запятой и @request вставляется в список.

Это на самом деле эквивалентно:

my $reply = $service->call('requestMessage' => \@request, $header);

Что здесь происходит?

РЕДАКТИРОВАТЬ: Спасибо за ответы. Я хорошо знаю разницу между передачей по значению и передачей по ссылке. Я спрашивал, превращается ли очевидный проход по значению в проход по ссылке. Очевидно нет. Спасибо всем за ответы.

Ответы [ 5 ]

10 голосов
/ 08 декабря 2009

Код в вопросе:

my $reply = $service->call('requestMessage' => @request, $header);

равно не эквивалентно этому:

my $reply = $service->call('requestMessage' => \@request, $header);

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

my $reply = $service->call('requestMessage', @request, $header);

Иногда «жирная запятая», как известно =>, используется для указания взаимосвязи между позиционными параметрами. Например, ссылка между именем метода some_method и его предполагаемым @arguments в этом коде:

$server->distribute_across_nodes(some_method => @arguments);
8 голосов
/ 08 декабря 2009

Что происходит, когда вы помещаете массив справа от оператора =>?

=> - это жирная запятая . не оказывает влияния на RHS . Он автоматически цитирует LHS, если LHS является голым словом .

Остальная часть вашего вопроса, кажется, сводится к тому, есть ли разница между передачей функции массив и ссылкой на массив: Да, есть. В первом случае массив выравнивается и передается функции. Таким образом, если массив содержит 1000 элементов, список аргументов функций увеличится на 1000 элементов.

Во втором случае передается ссылка на массив, поэтому размер списка аргументов не зависит от размера массива, на который указывает ссылка, переданная функции.

5 голосов
/ 08 декабря 2009

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

split /,/ => $var;

Может быть, автор вашего кода попадает в этот лагерь?

2 голосов
/ 08 декабря 2009

Глядя на код SOAP :: Lite, он в конечном итоге делает этот вызов

$serializer->envelope(method => shift, @_)

Итак, ваш оригинальный звонок

$service->call('requestMessage' => @request, $header);

просто использует жирную запятую, чтобы подчеркнуть, что содержимое (@request, $header ) станет параметрами для мыльного вызова requestMessage. Это не совсем понятно, потому что $ header является частью параметров, но соглашение не проясняет это. Я бы сказал, что в этом случае жирная запятая ничего не добавляет.

Я видел «подчеркнутую запятую», используемую в CGI-скриптах, вот так (не проверено)

$q->param(foo => $bar)

Я думаю, что он неплохо показывает, что этот вызов установит параметр foo. Но очевидно, что это также может сбивать с толку. Используйте с осторожностью.

1 голос
/ 08 декабря 2009

Будет передано "requestMessage", затем все значения в @request (в качестве параметров 2-го, 3-го ... и т. Д.), А затем $header. Они, вероятно, попадут в хеш.

Вот пример:

perl -MData::Dumper -e '@a = (1, 2, 3, 4); 
                        %b = ('a' => @a, 'c'); 
                        print Dumper(\%b);'
$VAR1 = {
          '4' => 'c',
          'a' => 1,
          '2' => 3
        };

Так что в этом случае это так же, как

%b = ('a' => 1, 2 => 3, 4 => 'c');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...