Изменчивые или неизменные замыкания - PullRequest
1 голос
/ 04 апреля 2009

На императивном объектно-ориентированном языке имеет больше смысла иметь изменяемые или неизменные замыкания?

Например:

int i=5;
function() f={print(i);};
f();
i=6;
f();

Если замыкание изменчиво, это выдает:

5
6

Если он неизменный, он напечатает:

5
5

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

class I {int i;}
I i=new I();
i.i=5;
function() f={
    I j=i;
    print(j.i);
};
f();
i.i=6;
f();

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

Ответы [ 2 ]

4 голосов
/ 04 апреля 2009

Императивные языки обычно строятся вокруг концепции государства. Следовательно, имеет смысл отражать особенности языка, включая замыкания. Да, такое поведение иногда может сбивать с толку, но это часть проблемы и преимущества наличия состояния в вашем приложении.

Я думаю, что лучшее доказательство этого аргумента - взглянуть на некоторые из самых последних языков, которые поддерживают закрытие. И C #, и VB.Net, императивные языки OO, решили иметь изменяемые замыкания. В то время как F #, функциональный язык, имеет неизменяемые замыкания (в основном, исходя из идеи, что F # является неизменяемым по умолчанию).

Кроме того, что на самом деле означало бы иметь неизменное замыкание на императивном языке? Большинство людей считают, что переменные эквивалентны C # только для чтения. Конечно, типы значений будут защищены от модификации, но как насчет изменяемых ссылочных типов. Вы не сможете изменить место, на которое указывает переменная, но вы можете вызвать мутирующую функцию и получить аналогичный эффект. Например.

class Student {
  public string Name { get; set; }
}

void Example() {
  var student = new Student() { Name = "foo" };
  Action() del = () => 
    { student.Name = "bar"; };
  del();
}

Это может быть реализовано с неизменным замыканием, поскольку я фактически не изменяю, куда указывают переменные. Тем не менее, я явно все еще делаю мутантную операцию.

3 голосов
/ 04 апреля 2009

В каких языках есть лямбды, которые захватывают по значению или захватывают по ссылке? Решите сами, но см. " О лямбдах, захвате и изменчивости " для получения дополнительных комментариев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...