هل هناك فرق بين ::و .عند استدعاء أساليب الفئة في روبي ؟
سؤال
سؤال بسيط ولكن واحدة التي كنت غريبة عن...هل هناك الوظيفية الفرق بين الأمرين التاليين?
String::class
String.class
كلاهما لا ما أتوقع -- وهذا هو القول عودتهم Class
- ولكن ما هو الفرق بين استخدام ::
و .
?
أنا لاحظت أن على تلك الفئات التي لديها ثوابت محددة ، IRB لصناعة السيارات في الانتهاء سيعود الثوابت كما تتوفر خيارات عند الضغط على tab بعد ::
ولكن ليس بعد .
, ولكن لا أعرف ما السبب في ذلك...
المحلول
على .
المشغل الأساس يقول "أرسل هذه الرسالة إلى كائن".في المثال الخاص بك هو الدعوة خاصة الأعضاء.على ::
المشغل "التدريبات وصولا" إلى النطاق المحدد إلى اليسار من المشغل ، ثم يدعو الأعضاء المحددة على الجانب الأيمن من المشغل.
عند استخدام ::
عليك أن تكون المرجعية الأعضاء التي تم تعريفها.عند استخدام .
يمكنك ببساطة إرسال رسالة إلى الكائن.لأن هذه الرسالة يمكن أن يكون أي شيء ، الإكمال التلقائي لا يعمل .
في حين أنه لا ::
.
نصائح أخرى
في الواقع, الإكمال التلقائي لا تعمل .
.الانتهاء الخيارات هي وجدت من خلال الدعوة #methods
على الكائن.يمكنك أن ترى هذا بنفسك عن طريق تجاوز Object.methods
:
>> def Object.methods; ["foo", "bar"]; end
=> nil
>> Object.[TAB]
Object.foo Object.bar
>> Object.
لاحظ أن هذا يعمل فقط عند التعبير على يسار .
هو الحرفي.وإلا الحصول على كائن الاتصال #methods
على أن يشمل تقييم الجانب الأيسر ، والتي يمكن أن يكون لها آثار جانبية.يمكنك ان ترى هذا بنفسك أيضا:
[continuing from above...]
>> def Object.baz; Object; end
=> nil
>> Object.baz.[TAB]
Display all 1022 possibilities? (y or n)
نضيف طريقة #baz
إلى Object
والتي ترجع Object
نفسها.ثم نحن الإكمال التلقائي للحصول على الأساليب التي يمكن أن نطلق على Object.baz
.إن المجلس دعا Object.baz.methods
, سيكون الحصول على نفس الشيء Object.methods
.بدلا من ذلك ، IRB وقد 1022 الاقتراحات.أنا لست متأكدا من أين جاءوا ، ولكن من الواضح انها قائمة عامة والتي لا تستند في الواقع على السياق.
على ::
المشغل هو (أيضا) تستخدم للحصول على الوحدة والثوابت ، في حين .
هو لا.هذا هو السبب HTTP
سوف تظهر في إنجاز Net::
, ولكن ليس Net.
. Net.HTTP
أليس الصحيح ، ولكن Net::HTTP
هو.