ما هي بالضبط فئة المفردة في روبي؟
سؤال
هل الطبقة المفردة في روبي هي فئة بحد ذاتها؟هل هذا هو السبب في أن جميع الكائنات تنتمي إلى "الفصل؟" المفهوم هو أجعد, ، لكنني أعتقد أن الأمر يتعلق بالسبب الذي يجعلني أستطيع تحديد طريقة الفصل على الإطلاق (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"> ساعدني على فهم دروس سينغلتون في روبي ولديه رمز جيد مثال.
وأما مجرد تحديث لPistos الجواب، من الإصدار 1.9.2 روبي إضافة جملة جديدة إلى الحصول على الدرجة المفرد
singleton_class = ( class << foo; self; end )
ويمكن الاستعاضة عنها بما يلي:
singleton_class = foo.singleton_class
وو-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 استخدام الخلط بين هذا المصطلح "الكائن المفرد"، وهو مفهوم مختلف. كائن مفرد يأتي من الطبقة التي لديها طريقة منشئ / المسرع في تجاوز بحيث يمكنك تخصيص واحد فقط من تلك الفئة.