от
При изучении нового языка программирования, одним из возможных препятствий вы можете столкнуться-это вопрос, Является ли язык, по умолчанию, передавать по значению или пройти по ссылке. Так вот мой вопрос ко всем вам, в вашем любимом языке, как это реально сделать? И каковы возможные подводные камни? Ваш любимый язык может, конечно, быть все, что вы когда-либо играли с: интересных, непонятных, эзотерика, новые, старые...

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.

12 Ответы

0 голосов
от
При изучении нового языка программирования, одним из возможных препятствий вы можете столкнуться-это вопрос, Является ли язык, по умолчанию, передавать по значению или пройти по ссылке. Так вот мой вопрос ко всем вам, в вашем любимом языке, как это реально сделать? И каковы возможные подводные камни? Ваш любимый язык может, конечно, быть все, что вы когда-либо играли с: интересных, непонятных, эзотерика, новые, старые...
0 голосов
от
Вот мой собственный вклад на языке программирования Java. первая часть кода:
public void swap(int x, int y)
{
  int tmp = x;
  x = y;
  y = tmp;
}
вызов этого метода приведет в этом:
int pi = 3;
int everything = 42;

swap(pi, everything);

System.out.println("pi: "   pi);
System.out.println("everything: "   everything);

"Output:
pi: 3
everything: 42"
даже используя 'реальные' объекты покажет аналогичный результат:
public class MyObj {
    private String msg;
    private int number;

    //getters and setters
    public String getMsg() {
        return this.msg;
    }


    public void setMsg(String msg) {
        this.msg = msg;
    }


    public int getNumber() {
        return this.number;
    }


    public void setNumber(int number) {
        this.number = number;
    }

    //constructor
    public MyObj(String msg, int number) {
        setMsg(msg);
        setNumber(number);
    }
}

public static void swap(MyObj x, MyObj y)
{
    MyObj tmp = x;
    x = y;
    y = tmp;
}

public static void main(String args[]) {
    MyObj x = new MyObj("Hello world", 1);
    MyObj y = new MyObj("Goodbye Cruel World", 

таким образом, очевидно, что Java передает параметры по значению, а значение Пи и все объекты MyObj не поменялись.
помните, что "по значению" - это единственный способ в Java для передачи параметров в метод. (например, язык, как C   позволяет разработчику передачи параметра по ссылке с помощью '
0 голосов
от
Вот еще одна статья на языке программирования C# в C# передает Аргументы по значению (по умолчанию)
private void swap(string a, string b) {
  string tmp = a;
  a = b;
  b = tmp;
}
вызов этой версии своп, таким образом, не будет никакого результата:
string x = "foo";
string y = "bar";
swap(x, y);

"output: 
x: foo
y: bar"
однако, в отличие от Java и C# не дает разработчику возможность передачи параметров по ссылке, Это можно сделать с помощью сайта с 'реф' перед типом параметра:
private void swap(ref string a, ref string b) {
  string tmp = a;
  a = b;
  b = tmp;
} 
этот своп будет изменить значение ссылочного параметра:
string x = "foo";
string y = "bar";
swap(x, y);

"output: 
x: bar
y: foo"
C# также имеет ключевое слово Out, а разница между ref и Out очень тонка. из MSDN: Вызывающий метод, который берет параметр out не требуется присвоить переменной переданной в качестве параметры до вызова; однако, абонент обязан присвоить параметру до возвращение. и В отличие от параметров ссылок рассмотрел первоначально назначенный абонента. Как таковой, вызываемый не требуется назначить Реф параметр перед использованием. Параметры ref передаются оба в и из метод. небольшая ошибка в том, как в Java, что объекты передаются по значению, все еще можно изменить, используя свои внутренние методы вывод: C# и передает свои параметры по умолчанию, на значение но при необходимости параметры могут быть переданы с помощью ссылки Реф сайта внутренние методы от параметра, передаваемого по значению, будет изменять объект (если сам этот метод изменяет некоторые значения) полезные ссылки: http://msdn.microsoft.com/en-us/vcsharp/aa336814.aspx http://www.c-sharpcorner.com/UploadFile/saragana/Willswapwork11162005012542AM/Willswapwork.aspx http://en.csharp-online.net/Value_vs_Reference
0 голосов
от
Python использует передачи по значению, но поскольку все эти ценности являются ссылки на объекты, чистый эффект-это что-то сродни пройти по ссылке. Однако, в Python программистов больше думать о том, тип объекта является изменяемым или неизменяемым. Изменяемые объекты могут быть изменены на месте (например, словари, списки, пользовательские объекты), в то время как неизменяемые объекты не могут (например, целые числа, строки, кортежи). В следующем примере показана функция, которая передается два аргумента, неизменяемые строки, и изменяемый список.
0 голосов
от
Поскольку я не видел ответа на Perl, но я думал, я мог бы написать один. Под капотом, Perl работает эффективно, как передача по ссылке. Переменные в качестве аргументов функции вызова передаются чистую, константы передаются в качестве значений только для чтения, и результаты выражений передаются в качестве временных протезов. Обычные идиомы, чтобы построить список аргументов по назначению список из
@_
, или
shift
склонны скрывать это от пользователей, создав видимость передачи по значению:
sub incr {
  my ( $x ) = @_;
  $x  ;
}

my $value = 1;
incr($value);
say "Value is now $value";
Это будет печать
Value is now 1
за
$x  
и увеличивается лексическая переменная, объявленная внутри функции
incr()
, а не переданной переменной. Это пройти по значению стиле, как правило, то, что хотел, большую часть времени, как функции, которые изменяют свои аргументы являются редкими в Perl, и стиль должны быть во избежаниеы. Однако, если по каким-то причинам такое поведение конкретно нужные, это может быть достигнуто путем операционной напрямую на элементы массива
@_
, потому что они будут псевдонимы переменные, передаваемые в функцию.
sub incr {
  $_[0]  ;
}

my $value = 1;
incr($value);
say "Value is now $value";
На этот раз он будет печатать
Value is now 2
, потому что
$_[0]  
выражение увеличивается действительной переменной
$value
. Это работает так, что под капотом
@_
не настоящий массив, как и большинство других массивов (например, можно было бы получить,
my @array
), но вместо ее элементы встроены непосредственно из аргументов, передаваемых в функцию вызова. Это позволяет построить передача по ссылке семантики, если это потребуется. Функция аргументы, назвать это простые переменные вставляются как есть в этом массиве, а константы или результаты более сложных выражений вводятся только для чтения Вэнс. Это, однако, чрезвычайно редки, чтобы делать это на практике, потому что Perl поддерживает эталонных значений, то есть значений, которые ссылаются на другие переменные. Обычно это гораздо яснее, чтобы построить функцию, которая имеет очевидный побочный эффект на переменную, передавая ссылку на эту переменную. Это ясно указывает читателю на callsite, что передача по ссылке семантики в силе.
sub incr_ref {
  my ( $ref ) = @_;
  $$ref  ;
}

my $value = 1;
incr(\$value);
say "Value is now $value";
Здесь оператор
\
дает ссылку так же, как адреса
0 голосов
от
Есть хорошее объяснение здесь .Чистая. Многие люди удивляют, которые ссылаются на объекты, на самом деле передаются по значению (как в C# и Java). Это копия адреса стека. Это предотвращает способ из изменения, когда объект фактически указывает на, но все еще обеспечивает способ изменения значения объекта. В C# можно передать ссылку на ссылку, которая означает, что вы можете изменить, где реальный объект указывает.
0 голосов
от
Не забудьте также пройти по имени, и передавать по значению-результату. Передаче по значению-результат аналогичен передаче по значению, с дополнительным аспектом, который имеет значение в исходной переменной, которая была передана в качестве параметра. Он может, в некоторой степени, избежать вмешательства в глобальные переменные. Это, видимо, лучше в секционированной памяти, где проходим по ссылке может вызвать ошибку страницы (ссылка). Пропуск на имя означает, что значения рассчитываются только тогда, когда они реально применяются, а не в начале процедуры. Алгол используется передача по имени, но интересный побочный эффект заключается в том, что это очень трудно написать процедуру подкачки (ссылка). Кроме того, выражение, переданное по имени проверяется при каждом обращении, которое также может иметь побочные эффекты.
0 голосов
от
по значению медленнее, чем по ссылке, так как система должна скопировать параметр используется только для входа по ссылке быстрее, так как только указатель пройден используется для ввода и вывода может быть очень опасным, если используется в сочетании с глобальными переменными
0 голосов
от
Что ни говори, как передать по значению или пройти по ссылке должны быть согласованы в разных языках. Самые распространенные и последовательные определения, используемые в разных языках является то, что с передача по ссылке, вы можете передать переменную в функцию "нормально" (т. е. без явного принятия решения или что-то подобное), и функция может назначить (не видоизменяют содержание) параметр внутри функции и он будет иметь такую же силу, как назначение переменной в вызывающем объеме. С этой точки зрения, языки сгруппированы следующим образом; каждая группа имеет те же передает семантику. Если вы считаете, что два языка не должно быть помещено в ту же группу, я призываю вас, чтобы придумать пример, который отличает их. Подавляющее большинство языков, включая C, Java, и на Python, Ruby или JavaScript-код, схему, данные, используемые, стандартные мл, идти, Objective-С, разговоры и т. д. все проходят по значению только. Передавая значение указателя (некоторые языки называют это "ссылка") не в счет, как пройти по ссылке; мы озабочены только пройденный вещь, указателя, а не вещь, на которую указывает. Языки, такие как C , с#, PHP путем передачи по значению по умолчанию, как выше языки, но функции можно явно объявить параметры, передача по ссылке, используя
0 голосов
от
В отношении Дж, в то время как есть только, насколько мне известно, передача по значению, есть форма передачи по ссылке, которая позволяет перемещать большое количество данных. Вы просто передаете нечто, известное как язык к глаголу (или функции). Это может быть экземпляр класса или просто универсальный контейнер.
spaceused=: [: 7!:5
...