إنشاء التجزئة باستخدام كتلة (روبي)
سؤال
هل يمكنني إنشاء تجزئة روبي من كتلة؟
شيء من هذا القبيل (على الرغم من أن هذا على وجه التحديد لا يعمل):
foo = Hash.new do |f|
f[:apple] = "red"
f[:orange] = "orange"
f[:grape] = "purple"
end
المحلول
لا أستطيع أن أفهم لماذا
foo = {
:apple => "red",
:orange => "orange",
:grape => "purple"
}
لا يعمل من أجلك؟
أردت أن أنشر هذا كتعليق ولكني لم أجد الزر ، آسف
نصائح أخرى
في Ruby 1.9 (أو مع تحميل ActiveSupport ، على سبيل المثال في القضبان) ، يمكنك استخدام Object#tap
, ، على سبيل المثال:
foo = Hash.new.tap do |bar|
bar[:baz] = 'qux'
end
يمكنك تمرير كتلة إلى Hash.new
, ، لكن هذا يعمل على تحديد القيم الافتراضية:
foo = Hash.new { |hsh, key| hsh[key] = 'baz qux' }
foo[:bar] #=> 'baz qux'
لما يستحق الأمر ، أفترض أن لديك غرضًا أكبر في الاعتبار مع هذه الأشياء. بناء الجملة { :foo => 'bar', :baz => 'qux' }
قد يكون كل ما تحتاجه حقا.
تمرير كتلة إلى Hash.new
يحدد ما يحدث عندما تطلب مفتاحًا غير موجود.
foo = Hash.new do |f|
f[:apple] = "red"
f[:orange] = "orange"
f[:grape] = "purple"
end
foo.inspect # => {}
foo[:nosuchvalue] # => "purple"
foo # => {:apple=>"red", :orange=>"orange", :grape=>"purple"}
نظرًا لأن البحث عن مفتاح غير موجود سيؤدي إلى زيادة كتابة أي بيانات موجودة :apple
, :orange
و :grape
, ، لا تريد أن يحدث هذا.
ها هو الرابط إلى hash.new المواصفات.
ما المشكلة في
foo = {
apple: 'red',
orange: 'orange',
grape: 'purple'
}
كما ذكر آخرون ، قد يحصل لك بناء جملة التجزئة البسيط على ما تريد.
# Standard hash
foo = {
:apple => "red",
:orange => "orange",
:grape => "purple"
}
ولكن إذا كنت تستخدم "النقر" أو التجزئة باستخدام طريقة كتلة ، فستحصل على بعض المرونة الإضافية إذا كنت بحاجة. ماذا لو لم نرغب في إضافة عنصر إلى موقع Apple بسبب بعض الحالة؟ يمكننا الآن أن نفعل شيئًا مثل ما يلي:
# Tap or Block way...
foo = {}.tap do |hsh|
hsh[:apple] = "red" if have_a_red_apple?
hsh[:orange] = "orange" if have_an_orange?
hsh[:grape] = "purple" if we_want_to_make_wine?
}