سؤال

s = Proc.new {|x|x*2}
puts s.call(5)
-> 10

def foo(&a)
 a.call(5)
end

puts "test foo:"
foo(s)

وعندما أحاول استدعاء بروك أعلاه، أحصل على:

foo: wrong number of arguments (1 for 0) (ArgumentError)
كان

وتوقعي أن أتمكن من تمرير بروك لطريقة إذا تم تعريف الأسلوب مع هذا النوع من التوقيع:

def foo(&a)

وبعد ذلك يمكن تنفيذ فو بروك insiide مثل هذا:

 a.call(5)
هل كانت مفيدة؟

المحلول

إذا كنت تريد تمرير بروك الفعلي لفو، مجرد تحديد ذلك مع def foo(a). وضع & أمام a يعني "هذه ليست في الواقع حجة. وبدلا من ذلك أخذ <م> كتلة تمريرها إلى هذا الأسلوب، إنشاء بروك للخروج منه، وتخزين تلك بروك في متغير و". وبعبارة أخرى مع تعريف الحالي يمكنك الاتصال فو مثل هذا:

foo do |x|
  puts x*2
end

ويمكنك أيضا استخدام & عند استدعاء أسلوب لتحويل بروك في كتلة:

foo(&s)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top