سؤال

هل يمكنني إنشاء تجزئة روبي من كتلة؟

شيء من هذا القبيل (على الرغم من أن هذا على وجه التحديد لا يعمل):

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?
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top