سؤال

في اللغة الحتمية، كانت لغة الكائنات، من المنطقي أن يكون لديك إغلاق قابل للتغيير أو غير قابل للتغيير؟

علي سبيل المثال:

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();

لذلك، سيكون من الأفضل أن يكون لديك إغلاق قابل للتغيير أو غير قابل للتغيير، أو لديك خيار لكليهما؟ يبدو أن إغلاق ثابت أسهل في التنفيذ، لذلك في هذه المرحلة، أعتقد أنني سأذهب مع ذلك، ما لم يكن هناك سبب وجيه لعدم ذلك.

هل كانت مفيدة؟

المحلول

عادة ما يتم بناء اللغات الحتمية حول مفهوم الدولة. وبالتالي، فمن المنطقي أن تعكس ميزات اللغة، بما في ذلك الإغلاق. نعم، يمكن أن يكون هذا السلوك مربكا في بعض الأحيان، لكنه جزء من المشكلة والاستفادة منه للحصول على حالة في طلبك.

أعتقد أن أفضل دليل على هذه الحجة هو أن ننظر إلى بعض اللغات الأخيرة التي لديها دعم إغلاق. كل من 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();
}

يمكن تنفيذ ذلك بإغلاق ثابت لأنني لا أقوم بالفعل بتعديل حيث تشير المتغيرات إلى ذلك. ومع ذلك، لا يزال من الواضح أن القيام بعملية تخشى.

نصائح أخرى

اللغات يجب أن تكون اللغات التي تلتقطها بالقيمة أو التقاط بالرجوع إليها؟ تقرر لنفسك، ولكن انظر "على Lambdas، والتقاط، والحل"لمزيد من التعليقات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top