سؤال

هل الطبقة المفردة في روبي هي فئة بحد ذاتها؟هل هذا هو السبب في أن جميع الكائنات تنتمي إلى "الفصل؟" المفهوم هو أجعد, ، لكنني أعتقد أن الأمر يتعلق بالسبب الذي يجعلني أستطيع تحديد طريقة الفصل على الإطلاق (class foo; def foo.bar ...).

ما هي فئة المفرد في روبي؟

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

المحلول

أولا تعريف بسيط:أ طريقة المفردة هي الطريقة التي يتم تعريفها فقط لكائن واحد.مثال:

irb(main):001:0> class Foo; def method1; puts 1; end; end
=> nil
irb(main):002:0> foo = Foo.new
=> #<Foo:0xb79fa724>
irb(main):003:0> def foo.method2; puts 2; end
=> nil
irb(main):004:0> foo.method1
1
=> nil
irb(main):005:0> foo.method2
2
=> nil
irb(main):006:0> other_foo = Foo.new
=> #<Foo:0xb79f0ef4>
irb(main):007:0> other_foo.method1
1
=> nil
irb(main):008:0> other_foo.method2
NoMethodError: undefined method `method2' for #<Foo:0xb79f0ef4>
        from (irb):8

أساليب المثيل هي أساليب فئة (أي.المحددة في تعريف الفئة).أساليب الفصل هي طرق مفردة على Class مثيل لفئة - لم يتم تعريفها في تعريف الفئة.بدلا من ذلك، يتم تعريفها على فئة مفردة من الكائن.

irb(main):009:0> Foo.method_defined? :method1
=> true
irb(main):010:0> Foo.method_defined? :method2
=> false

يمكنك فتح فئة المفردة لكائن باستخدام بناء الجملة class << obj.هنا، نرى أن هذه الفئة المفردة هي المكان الذي يتم فيه تعريف الأساليب المفردة:

irb(main):012:0> singleton_class = ( class << foo; self; end )
=> #<Class:#<Foo:0xb79fa724>>
irb(main):013:0> singleton_class.method_defined? :method1
=> true
irb(main):014:0> singleton_class.method_defined? :method2
=> true
irb(main):015:0> other_singleton_class = ( class << other_foo; self; end )
=> #<Class:#<Foo:0xb79f0ef4>>
irb(main):016:0> other_singleton_class.method_defined? :method1
=> true
irb(main):017:0> other_singleton_class.method_defined? :method2
=> false

لذلك فإن الطريقة البديلة لإضافة أساليب مفردة إلى كائن ما هي تعريفها مع فتح فئة الكائن المفرد:

irb(main):018:0> class << foo; def method3; puts 3; end; end
=> nil
irb(main):019:0> foo.method3
3
=> nil
irb(main):022:0> Foo.method_defined? :method3
=> false

في ملخص:

  • يجب أن تنتمي الأساليب دائمًا إلى فئة (أو:تكون طرق مثيل لبعض الفئات)
  • تنتمي الأساليب العادية إلى الفئة التي تم تعريفها فيها (أيهي طرق مثيل للفئة)
  • أساليب الفصل هي مجرد طرق مفردة لـ a Class
  • الأساليب المفردة للكائن ليست أساليب مثيل لفئة الكائن؛بل هي أساليب مثيل للفئة المفردة للكائن.

نصائح أخرى

وروبي يوفر وسيلة لتحديد الطرق التي هي محددة لكائن معين، وهذه الأساليب هي المعروفة باسم طرق المفرد. عندما يعلن احد طريقة المفرد على كائن، روبي تلقائيا بإنشاء فئة لمجرد عقد الطرق المفردة. ويطلق على الفئة التي تم إنشاؤها حديثا سينغلتون فئة.


    foo = Array.new
    def foo.size
      "Hello World!"
    end
    foo.size  # => "Hello World!"
    foo.class # => Array
    #Create another instance of Array Class and call size method on it
    bar = Array.new
    bar.size  # => 0
الطبقة المفرد هو كائن فئة مجهولة محددة الذي تم إنشاؤه تلقائيا وإدراجها في التسلسل الهرمي الميراث.

ويمكن أن يسمى singleton_methods على كائن للحصول على قائمة بأسماء لجميع الطرق المفردة على كائن.

    foo.singleton_methods  # => [:size]
    bar.singleton_methods  # => []

وهذه المادة href="http://www.devalot.com/articles/2008/09/ruby-singleton"> ساعدني على فهم دروس سينغلتون في روبي ولديه رمز جيد مثال.

وو-oreinted العمل الأكثر واقعية الطريق / للتفكير في الأمر (IMHO) هو: كما سلسلة الميراث، أو طريقة بحث طلب / القرار. هذه الصورة قد يساعد

HTTP: // www.klankboomklang.com/2007/11/25/modules-part-i-enter-the-include-class/

وهذا هو ص 1.9، المتناقضة الطبقات مدمج والمعرفة: أنا لا تزال تتحرى هذه واحدة

http://d.hatena.ne.jp/sumim/20080111/p1

وأيضا، أنا htink استخدام الخلط بين هذا المصطلح "الكائن المفرد"، وهو مفهوم مختلف. كائن مفرد يأتي من الطبقة التي لديها طريقة منشئ / المسرع في تجاوز بحيث يمكنك تخصيص واحد فقط من تلك الفئة.

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