Почему Perl позволяет передавать аргументы по ссылке? - PullRequest
5 голосов
/ 13 мая 2011

Мне интересно, почему в Perl есть возможность передавать аргумент по ссылке на функцию?Я знаю, что ни Python, ни Ruby не имеют такой возможности.

Ответы [ 3 ]

7 голосов
/ 13 мая 2011

Полезно отличать одну вещь от другой.

(1) Передача аргументов в подпрограмму по ссылке . Это полезно в Perl, потому что язык передает все аргументы подпрограмме в виде недифференцированного списка значений . Например, без возможности передавать структуры данных по ссылке разработчик функции, работающей с двумя списками, не сможет хранить списки отдельно. Кроме того, если структуры данных велики, передача их по ссылке может повысить производительность.

process_two_lists( @x,  @y); # Can't distinguish the lists.
process_two_lists(\@x, \@y); # Can.

Поскольку Python и Ruby разработаны по-разному, они не требуют этого различия в том, как передаются аргументы. Подобный метод в Python или Ruby получил бы два различных аргумента (два объекта, представляющих списки x и y).

(2) Поведение Perl, при котором @_ служит псевдонимом для переданных аргументов, позволяя подпрограмме изменять данные, воспринимаемые вызывающей стороной.

sub add_ten_to_me {
    $_[0] += 10;
}

my $x = 1;
add_ten_to_me($x);
say $x;            # 11  Amazing!

Python и Ruby также могут делать такие вещи; Тем не менее, есть некоторые квалификации. Python различает изменяемые и неизменные объекты. Если вы передадите что-то изменяемое в метод Python (например, список), метод сможет изменить структуру данных. Таким образом, версия Python process_two_lists сможет изменять как x, так и y. Однако функция, получающая неизменяемые объекты (например, целое число), не будет. Таким образом, прямой аналог Python add_ten_to_me не будет работать. [Я полагаю, что аналогичные замечания могут быть сделаны в отношении Ruby, но я менее знаком с деталями на данном этапе.]

6 голосов
/ 13 мая 2011

Передача аргументов по ссылке может значительно улучшить производительность.

4 голосов
/ 13 мая 2011

Perl дает вам выбор.Я думаю, что это часть этой идеи TIMTOWTDI.Это гибкий метод, поэтому вы можете делать то, что вам нужно.Если вы получаете доступ к аргументу как $_[0], то это тот же объект.Если вы сдвинете его или скопируете в лексический, это по значению.

Так что думай об этом так.Большая часть кода по значению, но по ссылке там, где вам это нужно.

...