لماذا يقوم Hash.new({}) بإخفاء أعضاء التجزئة؟[ينسخ]

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

  •  10-07-2019
  •  | 
  •  

سؤال

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

إذن هذا ما فعلته:

>> a = Hash.new({})
=> {}
>> a[:a][:b] = 5
=> 5
>> a
=> {}
>> a[:a]
=> {:b=>5}
>> a.keys
=> []
>> a.size
=> 0
>> a[:a].size
=> 1

بمعنى آخر، لا أرى عضو التجزئة عندما أقوم بفحص التجزئة، لكن يمكنني الوصول إليه عن طريق مفتاحه.

فهل هذا هو السلوك المتوقع؟ما الذي يجري هنا؟

راجع للشغل، هذا هو روبي 1.9.1، لم تجرب الإصدارات السابقة.

يحرر:مثال مبسط لأنه ليس من الضروري أن يكون تجزئة تجزئات ...

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

المحلول

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

>> a[:a][:b] = 1
=> 1
>> a[:c][:d] = 2
=> 2
>> a[:d]
=> {:b=>1, :d=>2}

الطريقة التي يعمل بها Hash.new مع الوسيطة الافتراضية هي:اذا فعلت hash[key] يتحقق مما إذا كان هذا المفتاح موجودًا في التجزئة.إذا حدث ذلك، فإنه يُرجع قيمة هذا المفتاح.إذا لم يكن الأمر كذلك فإنه يقوم بإرجاع القيمة الافتراضية.لا يضيف المفتاح إلى التجزئة وسيعيد نفس الكائن الافتراضي (وليس نسخة) في كل مرة.

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

Hash.new { |h,k|  h[k] = {} }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top