arrays - مصفوفتين - مصفوفة الكائنات في الجافا




لماذا إلحاق قيمة إلى مصفوفة في التجزئة سوف أيضا تعديل المتغير الآخر الذي تم تعيينه؟ (4)

عينة من الرموز:

hash_of_array = { a: [] }
b = hash_of_array
c = hash_of_array

b[:a] << 1

puts b # => { a: [1] }
puts c # => { a: [1] }

لماذا يكون لكل من المتغير 1 في صفيفهم؟ أنا فقط إلحاقه على متغير b .

جرب

  • روبي الإصدار 2.3.1، 2.4.0
  • Rbenv

أعرف شخص يدعى يوحنا. البعض يدعوه جوني. جوني حصلت النار اليوم. لماذا حصل جون أيضا على النار؟

foo = _something_

ببساطة يعطي الاسم البديل foo إلى _something_ . انها لا استنساخ أو القيام بأي شينانيغانز أخرى.


كما ذكر في السابق، إجابات ممتازة، المشكلة التي تواجهها هي أن a و b هي نفس الكائن. وأوصى إجابة أخرى (تم حذفها لاحقا) باستخدام طريقة دوب، إذا كانت نسخة ضحلة كافية. المشكلة هي أنه في السيناريوهات الخاصة بك، نسخة ضحلة ليست جيدة بما فيه الكفاية.

أقترح أن أحاول جوهرة full_dup. هذه الأحجار الكريمة يضيف طريقة جديدة، ودعا full_dup. A full_dup يفعل نسخة عميقة من الكائنات الخاصة بك. لذا، على سبيل المثال:

require 'full_dup'

hash_of_array = { a: [] }
b = hash_of_array.full_dup
c = hash_of_array.full_dup

b[:a] << 1

puts b # => { a: [1] }
puts c # => { a: [] }

كما جانبا، full_dup لا سرعة شيطان. يجب عليك استخدام دوب العادية عندما يكون هذا الأسلوب هو كل ما تحتاجه.

وجه الفتاة؛ نسيت أن أذكر. أنا مؤلف جوهرة كاملة.


يتم تعيين جميع الكائنات في روبي بالإشارة باستثناء ترو، فالس، نيل و فيكسنومز التي يتم التعامل معها خصيصا.

يمكنك اختبار بها من خلال النظر في object_id

irb(main):001:0> a = [1,2,3]
=> [1, 2, 3]
irb(main):002:0> b = a
=> [1, 2, 3]
irb(main):003:0> a.object_id == b.object_id
=> true

لإنشاء نسخة من كائن، استخدم .dup .

irb(main):005:0> b = a.dup
=> [1, 2, 3]
irb(main):006:0> a.object_id == b.object_id
=> false

على سبيل المثال، تحتاج إلى نسخة عميقة، حتى تتمكن من القيام به

Marshal.load(Marshal.dump(hash))

وبالتالي،

irb(main):037:0> a = {a: []}
=> {:a=>[]}
irb(main):038:0> b = Marshal.load(Marshal.dump(a))
=> {:a=>[]}
irb(main):039:0> b[:a] << 1
=> [1]
irb(main):040:0> b
=> {:a=>[1]}
irb(main):041:0> a
=> {:a=>[]}

في المثال الخاص بك، وكما ذكر من قبل AndreyDeineko ، b و c هي في الأساس نفس الكائن.

ليس هناك حاجة لإظهار السلوك كنت الخلط حول، على الرغم من.

المهم أن لديهم إشارة إلى نفس المصفوفة:

array = []

b = { b: array }
c = { c: array }

puts b == c
#=> false

puts b.object_id == c.object_id
#=> false

puts b[:b].object_id == c[:c].object_id
#=> true

b[:b] << 'test'

p b
# {:b=>["test"]}
p c
# {:c=>["test"]}






hash