سؤال

خلق تجزئات التجزئة في روبي يتيح اثنين (أو أكثر) الأبعاد عمليات البحث.ومع ذلك ، عند إدخال واحد يجب دائما التحقق من إذا كان أول مؤشر موجود بالفعل في تجزئة.على سبيل المثال:

h = Hash.new
h['x'] = Hash.new if not h.key?('x')
h['x']['y'] = value_to_insert

سيكون من الأفضل أن تفعل ما يلي حيث تجزئة جديدة يتم إنشاؤها تلقائيا:

h = Hash.new
h['x']['y'] = value_to_insert

وبالمثل ، عند البحث عن قيمة حيث أول مؤشر لا موجودة بالفعل ، فإنه سيكون من الأفضل إذا كان النيل هو عاد بدلا من تلقي غير معروف طريقة '[]' خطأ.

looked_up_value = h['w']['z']

يمكن للمرء أن إنشاء تجزئة المجمع الدرجة التي لديها هذا السلوك ، ولكن هناك موجود روبي لغة لإنجاز هذه المهمة ؟

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

المحلول

يمكنك تمرير Hash.new وظيفة كتلة التي يتم تنفيذها لانتاج القيمة الافتراضية في حالة الاستعلام عن قيمة لا توجد حتى الآن:

h = Hash.new { |h, k| h[k] = Hash.new }

بالطبع, هذا يمكن القيام به بشكل متكرر.

/تحرير:واو هناك مقال الإجابة على هذا السؤال.

لأجل اكتمال هنا الحل من المادة التعسفي عمق التجزئة:

hash = Hash.new(&(p=lambda{|h,k| h[k] = Hash.new(&p)}))

الاعتمادات تذهب إلى كينت من بيانات الضوضاء.

نصائح أخرى

وAutovivification، كما يطلق عليه، هو بمثابة نعمة ونقمة. والمشكلة يمكن أن يكون أنه إذا "نظرة" على قيمة قبل أن يتم تعريفه، كنت عالقا مع هذه التجزئة فارغة في فتحة وكنت في حاجة إلى تقليم تشغيله في وقت لاحق.

إذا كنت لا تمانع قليلا من الفوضى، يمكنك دائما مجرد ازدحام في أو يساوي الإعلانات النمط الذي سوف تسمح لك لبناء الهيكل كما هو متوقع الاستعلام ما يلي:

((h ||= { })['w'] ||= { })['z']
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top