سؤال

أجد نفسي أكرر الأشياء كثيرًا عندما أقوم بإنشاء دروس في روبي، وغالبًا ما ينتهي بي الأمر بشيء مشابه لما يلي:

class Foo
  attr_reader :bar_0,
              :bar_1,
                 .
                 .
                 .
              :bar_n
  def initialize( bar_0 = something,
                  bar_1 = something,
                        .
                        .
                        .
                  bar_n = something)
    @bar_0 = bar_0
    @bar_1 = bar_1
           .
           .
           .
    @bar_n = bar_n
  end
end

هل تستخدم روبي اختصارًا لتنفيذ شيء كهذا بشكل أكثر كفاءة؟

هل كانت مفيدة؟

المحلول

انطلاقًا من طريقة صياغة السؤال، ربما ينبغي عليك إعادة التفكير في تصميم فصولك الدراسية.ومع ذلك، توفر روبي طريقة مثيرة للاهتمام لإنشاء الفصول الدراسية بسرعة attr_accessorق (ليس القراء).إليك مثال بسيط:

>> class Person < Struct.new(:name, :age) ; end
=> nil
>> p = Person.new
=> #<struct Person name=nil, age=nil>
>> p.age = 23
=> 23
>> p.class
=> Person
>> p.methods.grep(/age/)
=> [:age, :age=]

بالطبع هذه فئة عادية ويمكنك إضافة جميع الطرق التي تريدها (واستخدام الحروف والمحددات بدلاً من متغيرات الحالة، على سبيل المثال. var للحصول على و self.var = foo للواضع).

إذا كنت لا تريد الكتاب حقًا، فاجعلهم خاصين أو undef هم.

>> attrs = [:name, :age]
=> [:name, :age]
>> class Person < Struct.new *attrs ; end
=> nil
>> Person.instance_eval { private *attrs.map{|attr| "#{attr}=" }}
=> Person
>> p = Person.new
=> #<struct Person name=nil, age=nil>
>> p.methods.grep(/age/)
=> [:age]

كل ما سبق لا يساعد في الكثير من المهام initialize بالطبع، ولكن بعد ذلك يتساءل المرء عما إذا كنت تريد حقًا استخدام العديد من وسيطات المُنشئ أو إذا كان لديك وسيطة تجزئة واحدة فقط ودمجها في تجزئة افتراضية.

نصائح أخرى

Ruby ديناميكي ويقدم الكثير من حيث الاستبطان، حتى تتمكن من الاستفادة من التعريف (أو كتابة التعليمات البرمجية التي يكتبها أساسا).في مثالك، هناك العديد من الأشياء التي يمكنك القيام بها لتنظيف الألغام:

giveacodicetagpre.

نظرا لأن مهمة الكتلة هي سلوك شائع وقابل لإعادة الاستخدام، فمن المنطقي استخراجها إلى وحدة منفصلة وجعلها mixin:

giveacodicetagpre.

يمكنك استخدام

يمكنك استخدام إدخال كائن المعلمة طريقة إعادة تكوينها لتبسيط مكالمة منشئ.

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