سؤال
كنت أتوقع البرمجية التالية إلى طباعة "8", "111" و "999".أنا من المفترض أن كل من a, b, c و d يشير إلى نفس موقع الذاكرة.إذا قمت بتغيير موقع من خلال واحد منهم لماذا الأخرى لا تتغير ؟ ومن الواضح المنطق بلدي الفقراء ، أو التغاضي عنها شيئا.فإنه يطبع "7", "7" و "8", بدلا من ذلك.
لماذا ؟
a=b=c=d=7
b = 8
puts d
c = 111
puts a
d = 999
puts b
[توضيح]
سبب حيرتي هو المثال في الكتاب (صفحة 20). يغيروا هناك وبالمثل القيم ، لكنها تحصل على النتائج التي أشرت أعلاه.يتكلم من نفس المشكلة ؟
المحلول
a=b=c=d=7
# a, b, c and d points to the same integer object "7"
b = 8
# b now points to a new object "8"
# "=" does not change the value of the pointer integer,
# it assings a new reference like in the line above
puts d
# obviously, d still points to "7"
c = 111
# c now points to another integer object "111"
puts a
# a still points to "7"
d = 999
# d now points to a new integer object "999"
puts b
# b still points to "8"
في روبي ، صحيح كائن غير قابل للتغيير لذا لا يمكنك تعيين عدد صحيح متعددة المرجعية تغيير قيمته بعد.
كما @pts اقترح عليك استخدام صفيف إلى فهم صحيح المرجعية لأن المصفوفات هي قابلة للتغيير أن كنت قادرا على تغيير قيمة بعد.
a=b=c=d=[7]
b[0] = 8
puts d[0]
c[0] = 111
puts a[0]
d[0] = 999
puts b[0]
التوضيح:
إذا كنت تأتي من C++ الخلفية ، قد يكون غريبا لأن C++ هل الأشياء 2 مع نفس الجملة تعيين مرجع وتغيير القيمة المشار إليها.
int a = 10; // creates an int on the stack with value 10
int& b = a; // creates a reference to an int and references the a variable
b = 5; // change the value referenced by b (so a) to 5
// a and b now hold the value 5
في روبي ، مرجع هي قابلة للتغيير و الاعداد الصحيحه ليست (بالضبط عكس C++).حتى تعيين إشارة من شأنها تغيير الواقع المرجعي وليس المشار إليه القيمة.
آخر حل هو إنشاء فئة هي قابلة للتغيير صحيح:
class MutableInteger
attr_writer :value
def initialize(value)
@value = value
end
def inspect
value
end
def to_i
value
end
def to_s
value
end
end
a = b = MutableInteger.new(10)
a.value = 5
puts b
# prints 5
نصائح أخرى
أسهل طريقة للحصول على المخرجات المتوقعة باستخدام واحد عنصر الصفيف:
a=b=c=d=[7]
b[0] = 8
puts d[0]
c[0] = 111
puts a[0]
d[0] = 999
puts b[0]
الحصول على إذا كان a و b الرجوع إلى نفس الكائن ، استخدام a.__id__ == b.__id__
.
أنها لا تشير إلى نفس موقع الذاكرة. روبي لا يمر عن طريق الإشارة.
بعد السطر الأول ، a ، b ، c و d كلها تشير إلى نفس Fixnum كائن (مع قيمة 7).ومع ذلك ، عند تنفيذ ب = 8 b الآن نقطة جديدة Fixnum كائن (مع قيمة 8).
فعليا أنت تخصص ب إلى وجوه جديدة بدلا من تحور كائن موجود.هذا هو السبب في التغييرات لا يتم نشر كما هو متوقع.
إذا كنت مقارنة مع C++, هذا هو مثل تعيين المؤشر من حيث القيمة بدلا من تعيين من قبل المرجعية.
وإنني أوصي بشدة القراءة ج يمر بالرجوع جافا و روبي لا