سؤال

كنت أتوقع البرمجية التالية إلى طباعة "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++, هذا هو مثل تعيين المؤشر من حيث القيمة بدلا من تعيين من قبل المرجعية.

وإنني أوصي بشدة القراءة ج يمر بالرجوع جافا و روبي لا

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