طريقة أكثر طبيعية لاستدعاء Proc في Ruby 1.9
سؤال
كما نعلم، هناك عدة طرق لاستدعاء Proc في Ruby 1.9
f =->n {[:hello, n]}
p f[:ruby] # => [:hello, :ruby]
p f.call(:ruby) # => [:hello, :ruby]
p f.(:ruby) # => [:hello, :ruby]
p f === :ruby # => [:hello, :ruby]
أشعر بالفضول، ما هي الطريقة "الطبيعية" للاتصال بـ Proc؟ربما تعني كلمة "طبيعي" المزيد من علوم الكمبيوتر - مثل الطريقة.
المحلول
الخيار الثاني هو الأكثر استخدامًا على الإطلاق.
p f.call(:ruby) # => [:hello, :ruby]
يجعلها أكثر تشابهًا مع الطريقة القياسية.أيضًا، تعتمد بعض المكتبات فعليًا على كتابة البطة عند التحقق من صحة الوسائط والتحقق من توفر ملف #call
طريقة.في هذه الحالة، باستخدام #call
يضمن أنه يمكنك توفير لامدا أو أي كائن آخر (بما في ذلك فئة) يستجيب له #call
.
Rack
تعد البرامج الوسيطة مثالًا رائعًا على هذه الاتفاقية.يمكن أن تكون البرامج الوسيطة الأساسية عبارة عن lambda، أو يمكنك توفير منطق أكثر تعقيدًا باستخدام الفئات.
نصائح أخرى
أنا دائما استخدام الخيار 3. النظر في الغموض النحوية من القدرة على الاتصال بطرق دون قوسين، وهذا هو الأقرب يمكنك الوصول إلى بناء جملة استدعاء الطريقة الفعلية.
رأيت الطريقة الأولى تستخدم في رف التعليمات البرمجية المصدر.ذلك الخلط لي في وقت طويل.انها التقطت من lib/رف/البناء.rb (الإصدار:1.6.0.ألفا)
module Rack
class Builder
...
def to_app
app = @map ? generate_map(@run, @map) : @run
fail "missing run or map statement" unless app
# This is the first option calling a proc
# @use is a array of procs (rack middleware)
@use.reverse.inject(app) { |a,e| e[a] }
end
...
end
end