هل هناك فرق بين ::و .عند استدعاء أساليب الفئة في روبي ؟

StackOverflow https://stackoverflow.com/questions/43134

  •  09-06-2019
  •  | 
  •  

سؤال

سؤال بسيط ولكن واحدة التي كنت غريبة عن...هل هناك الوظيفية الفرق بين الأمرين التاليين?

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 هو.

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