سؤال

رأيت بعض التعليمات البرمجية في TCL مثل هذا:

namespace eval ::info {
    set count 0;
    set id 1;
    set role admin;

    namespace export *
}



proc ::info::setcount {
    set ::info::count 0;
}

proc ::info::setId {
    set ::info::id 1;
}

proc ::info::setRole {
    set ::info::role user;
}

هناك ثلاثة متغيرات محددة في مساحة الاسم ::info، ولكن لم يتم الإعلان عن ثلاثة procs(setcount setId setRole) في مساحة الاسم، ويبدو أنها محددة خارج ::info، هل هذا مسموح به؟كيف يعمل هذا؟

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

المحلول

الإجراءات نكون المحددة في ::info مساحة الاسم.إنهم ليسوا داخل نطاق namespace eval, ، وهو أمر يقوم فقط بإنشاء مساحة الاسم إذا لزم الأمر ثم ينفذ البرنامج النصي المحدد ضمن هذا السياق.يتم تنفيذه في سياق مساحة الاسم مما يغير كيفية تنفيذه proc يضع الأوامر التي يقوم بإنشائها عندما تكون أسماء تلك الأوامر غير مؤهلة بشكل كامل.مساحة الاسم موجودة بشكل مستقل عن namespace eval يتصل.يجب أن يتم الإعلان عن المتغيرات في مساحة الاسم بالرغم من ذلك؛هذا يتجنب بعض المشاكل السيئة حقًا في حل المتغيرات التي يمكن أن تزعج الأشخاص.

أنا شخصياً أفضل كتابة الكود على النحو التالي:

namespace eval ::foo {
    proc bar ... {
        ...
    }
}

لكنني أعلم أن الآخرين يختلفون معي.اكتب ما تفضله، حيث تعمل Tcl بشكل جيد مع أي من النظامين.

نصائح أخرى

ال namespace eval يأمر

  1. ينشئ مساحة الاسم إذا لم تكن موجودة
  2. يقوم بتشغيل الكود المقدم له من داخل مساحة الاسم تلك

Procs محددة من داخل مساحة الاسم (وهي جميعها عبارة عن procs، نظرًا لأن مساحة الاسم الافتراضية هي ::)

  • إذا كانت مسبوقة بمساحة اسم مطلقة، فسيتم تحديد هذا الأمر في مساحة الاسم المحددة
  • إذا كانت مسبوقة بمساحة اسم نسبية، فسيتم تحديد هذا الأمر بالنسبة إلى مساحة الاسم الحالية

كما

namespace eval bob {
    namespace eval joe {
        proc proc1 {} {}
    }
    proc proc2 {} {}
    proc ::proc3 {} {}
    proc joe::proc4 {} {}
}
proc proc5 {} {}
proc bob::joe::proc6 {} {}
proc ::bob::joe::proc7 {} {}

الأوامر التالية ستكون موجودة

::bob::joe::proc1
::bob::proc2
::proc3
::bob::joe::proc4
::proc5
::bob::joe::proc6
::bob::joe::proc7

لاحظ أن الأوامر الموجودة في مساحة الاسم العامة، عند استدعائها من مساحة الاسم العامة، يمكن أن يسبقها a :: أم لا.وينطبق الشيء نفسه على الأوامر في أي مساحة اسم.

namespace eval bob {
    proc2 ;# calls ::bob::proc2
    ::proc5 ;# calls ::proc5 (proc5 in the global namespace)
    joe::proc4 ;# calls ::bob::joe::proc4
}

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

namespace eval bob {
    proc5 ;# calls ::proc5 since there is no ::bob::proc5
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top