لماذا غياب عامل التعيين تسمح لي لتعديل ثابت روبي مع أي تحذير المترجم؟

StackOverflow https://stackoverflow.com/questions/670094

سؤال

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

X = "hello"
X.concat(" world")
puts X # no warning

X = "hello"
X = X.concat(" world")
puts X # warning: already initialized

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

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

المحلول

وهذا هو لأنك إعادة تعريف علامة X جديد عند إعادة تعريف ثابت، فهو يوفر لك الخطأ "تمت تهيئته بالفعل". المثال الأول لا يعطي هذا الخطأ لأنك لا إعادة X، كنت تعديله.

نصائح أخرى

في روبي، المتغيرات أساسي إلى مكان في الذاكرة التي تحتوي على كائن - وليس هدف في حد ذاته. في المثال الثاني، كنت تهيئة X ثابت للإشارة إلى كائن في السطر الأول (X = "hello")، وفي السطر الثاني، كنت مرة أخرى تهيئة ثابت - لكنه يشير بالفعل إلى كائن، حتى تحصل على الخطأ.

وثبات ثابت لا يعني أنك لا يمكن أن يغير الكائن - وهو ما يعني فقط لأنك لا تستطيع تغيير ثابت للإشارة إلى <م> آخر الكائن

.

إذا كنت تريد أن تجعل سلسلة الخاص بك "الحقيقي" ثابت، في محاولة 'تجميد':

X = "foo".freeze        # => "foo" 
X.concat("bar")

TypeError: can't modify frozen string
    from (irb):2:in `concat'
    from (irb):2

وأنا حقا نشجعك على قراءة روبي البرمجة. لغة .

وذلك لأن X بثبات تخزين إشارة إلى كائن String. في المثال الأول الخاص بك، فإنك تقوم بتعديل الحالة الداخلية للكائن String، ولكن ليس المرجع تخزينها بواسطة ثابت. في المثال الثاني، كنت تقوم بتغيير إشارة تخزينها بواسطة ثابت إلى كائن String الجديد الذي تم إرجاعها من أسلوب concat.

والكتاب معول يفسر هذا هنا .

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