سؤال

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