arrays - كيف يمكنني استخدام `Array#dig` و` Hash#dig` المقدمة في Ruby 2.3؟




(2)

يقدم روبي 2.3 طريقة جديدة على Array و Hash تسمى dig . إن الأمثلة التي رأيتها في تدوينات المدونة حول الإصدار الجديد مفتعلة وملفقة:

# Hash#dig
user = {
  user: {
    address: {
      street1: '123 Main street'
    }
  }
}

user.dig(:user, :address, :street1) # => '123 Main street'

# Array#dig
results = [[[1, 2, 3]]]
results.dig(0, 0, 0) # => 1

أنا لا أستخدم صفائف مسطحة ثلاثية. ما هو مثال واقعي على كيف سيكون هذا مفيدا؟

تحديث

اتضح أن هذه الطرق تحل أحد أكثر الأسئلة ردةً. تتضمن الأسئلة أدناه شيئًا مثل 20 نسخة مكررة ، وكلها يتم حلها باستخدام عملية dig :

كيفية تجنب NoMethodError لعناصر مفقودة في تجزئة متداخلة ، دون الشيكات المتكررة المتكررة؟

نمط Ruby: كيفية التحقق من وجود عنصر التجزئة المتداخلة


إحدى الطرق ستكون بالاقتران مع عامل قراءة الملائكة من بعض نماذج الوثائق غير المعروفة.

some_json = JSON.parse( '{"people": {"me": 6, ... } ...}' )
# => "{"people" => {"me" => 6, ... }, ... }
a_bunch_of_args = response.data[:query]
# => ["people", "me"]
some_json.dig(*a_bunch_of_args)
# => 6

في حالتنا ، فإن NoMethodError s بسبب إشارات nil هي الأخطاء الأكثر شيوعًا التي نراها في بيئات الإنتاج لدينا.

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

لنأخذ مثالك. الأتى:

user.dig(:user, :address, :street1)

لا يساوي:

user[:user][:address][:street1]

في الحالة التي يكون فيها user[:user] أو user[:user][:address] nil ، سيؤدي ذلك إلى حدوث خطأ في وقت التشغيل.

بدلا من ذلك ، فإنه يعادل ما يلي ، وهو المصطلح الحالي:

user[:user] && user[:user][:address] && user[:user][:address][:street1]

لاحظ كيف أنه من السهل تمرير قائمة الرموز التي تم إنشاؤها في مكان آخر إلى Hash#dig ، بينما ليس من السهل جدًا إعادة إنشاء البنية الأخيرة من هذه القائمة. يتيح لك Hash#dig بسهولة الوصول الديناميكي دون الحاجة إلى القلق بشأن المراجع nil .

من الواضح أن Hash#dig هو أيضًا أقصر كثيرًا.

هناك نقطة مهمة يجب الانتباه إليها وهي أن Hash#dig نفسه تُرجع nil إذا ظهر أيًا من المفاتيح ، مما قد يؤدي إلى حدوث نفس الطبقة من الأخطاء خطوة بخطوة ، لذا قد يكون من الأفضل تقديم الافتراضي معقول. (تسمى هذه الطريقة في تقديم كائن يستجيب دومًا للطرق المتوقعة بنمط كائن Null .)

مرة أخرى ، في المثال الخاص بك ، سلسلة فارغة أو شيء من هذا القبيل "غير متاح" ، وهذا يتوقف على ما هو منطقي:

user.dig(:user, :address, :street1) || ""




hash