ما هو الأساس المنطقي/التاريخ لـ # الاتفاقية لتحديد الطرق في روبي؟

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

سؤال

على سبيل المثال ، لقد رأيت دائمًا طرقًا يشار إليها باسم String#split, ، لكن ابدا String.split, والتي تبدو أكثر منطقية قليلا. أو ربما حتى String::split, ، لأنك يمكن أن تفكر #split ليكون في مساحة اسم String. حتى أنني رأيت الطريقة وحدها ، عندما يتم افتراض/ضمني الفصل (#split).

أفهم أن هذه هي الطريقة التي يتم بها تحديد الأساليب في RI. الذي جاء أولا؟

هل هذا للتمييز ، على سبيل المثال ، طرق عن الحقول؟ لقد سمعت أيضًا أن هذا يساعد على تمييز طرق المثيل عن طرق الفصل. لكن من أين بدأ هذا؟

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

المحلول

يشير الفرق إلى كيفية الوصول إلى الأساليب.

طرق الفصل استخدم ال :: فاصل للإشارة إلى أنه يمكن إرسال الرسالة إلى كائن الفئة/الوحدة النمطية ، بينما طرق مثيل استخدم ال # فاصل للإشارة إلى أنه يمكن إرسال الرسالة إلى كائن مثيل.

سأختار Complex الفئة (في روبي 1.9) لإظهار الفرق. لديك كلاهما Complex::rect و Complex#rect. هذه الأساليب لها أقسوس مختلفة وتخدم أغراض مختلفة تمامًا. Complex::rect يأخذ حجة حقيقية وخيالية ، وإعادة مثيل جديد Complex, ، في حين Complex#rect إرجاع مجموعة من المكونات الحقيقية والخيالية للمثال.

ruby-1.9.1-p378 > x = Complex.rect(1,5)
 => (1+5i) 
ruby-1.9.1-p378 > x.rect
 => [1, 5] 
ruby-1.9.1-p378 > x.rect(2, 4) # what would this even do?
ArgumentError: wrong number of arguments(2 for 0)
    from (irb):4:in `rect'
    from (irb):4
    from /Users/mr/.rvm/rubies/ruby-1.9.1-p378/bin/irb:17:in `<main>'

أعتقد أن سبب عدم استخدامهم . نظرًا لأن الفاصل لكل شيء هو أنه سيكون غامضًا ما إذا كانت الطريقة تنتمي إلى فئة أو مثيل. الآن بعد أن اعتدت على قيام روبي بذلك ، أرى أنه في الواقع عيب في اتفاقيات اللغات الأخرى ، لأكون صادقًا.

أيضا ، هذا إلى حد ما من موضوع غير ذي صلة تماما من مجالات لأن جميع الرسائل التي يمكنك إرسالها هي الرسائل ، بشكل صحيح ، حتى لو تبدو مثل مجال يمكن الوصول إليه للجمهور. أقرب شيء عليك أن تتمثل في الحقول هو سمات أو متغيرات مثيل ، بالطبع ، والتي يتم دائمًا ما تكون مسبوقة بها @ وليسوا كذلك مباشرة يمكن الوصول إليها من خارج المثيل إلا إذا كنت تستخدم الميراث أو Object#instance_variable_get/_set.

على وجه التحديد لماذا اختاروا :: و #? :: من المنطقي بالنسبة لي لأنه يفصل بين مساحات الأسماء ، لكن # ربما كان مجرد رمز لم يتم استخدامه في التسميات الأخرى ويمكن الاعتراف به بشكل لا لبس فيه كفاصل مفاصل مثيل.

نصائح أخرى

أفهم أن هذه هي الطريقة التي يتم بها تحديد الأساليب في RI. الذي جاء أولا؟

نعم ، هذا هو المكان الذي جاء منه. عندما تستخدم #, ، تلقائيًا ترابط طرقك ، لذا بدأت الإشارات إلى طرق أخرى في الوثائق مرفوعة من قبل # إشارة. نرى هنا:

تلقائيًا ترتبط أسماء الفئات والملفات المصدر وأي أسماء بالأسلوب التي تحتوي على السطح السفلي أو مسبوقة بحرف التجزئة تلقائيًا من نص التعليق إلى وصفها.

لا يمكنك بالفعل استدعاء طريقة بهذه الطريقة. لكن هذا لا ينبغي أن يكون مفاجئًا ؛ بعد كل شيء، <cref ...> هو بيان غير صالح في C# على الرغم من كونه علامة وثائق صالحة.

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