Functions

  • JavaScript Variables: Undefined vs Not Defined

    عندما نتحدث عن الفروق بين “undefined” و “not defined” في سياق لغة البرمجة JavaScript، ندخل في تفاصيل فنية تعكس طريقة عمل المحرك (Engine) لتفسير الكود ومعالجته.

    عندما نقول أن متغيرًا معينًا معروفًا ولكن قيمته “undefined”، فإننا نشير إلى حقيقة أن هذا المتغير قد تم تعريفه في الكود، ولكنه لم يتم تعيين قيمة له بعد. وهذا يحدث عادةً عندما يتم تعريف المتغير باستخدام كلمة “var” أو “let”، ويتم تفسيره من قبل المحرك كمتغير معين في نطاق البرنامج، ولكن قيمته غير معينة حتى يتم تعيين قيمة له في وقت لاحق من التنفيذ.

    أما عندما نتحدث عن “not defined”، فنشير إلى حقيقة أن المحرك لا يستطيع العثور على التعريف نفسه للمتغير. يحدث هذا عندما نحاول الوصول إلى متغير لم يتم تعريفه بالفعل في النطاق الحالي للبرنامج. يتم التعامل مع هذه الحالة عادةً عند محاولة استخدام متغير غير معرف بدون تعريف سابق له، وينتج عنها خطأ “Uncaught ReferenceError”.

    الفارق الرئيسي هو أن “undefined” يشير إلى حالة المتغير الذي تم تعريفه ولكن لم يتم تعيين قيمة له بعد، بينما “not defined” يشير إلى حالة المتغير الذي لم يتم تعريفه على الإطلاق في النطاق الحالي للبرنامج.

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

    باختصار، الفارق بين “undefined” و “not defined” يعكس حالة تعريف المتغير أو الدالة في البرنامج، سواء كانت معروفة ولكن لم يتم تعيين قيمة لها بعد، أو غير معروفة ولم يتم تعريفها في النطاق الحالي للبرنامج.

    المزيد من المعلومات

    بالطبع، دعني أوضح بعض المزيد من المعلومات حول هذا الموضوع.

    عندما نقول أن المتغير معروف ولكن قيمته “undefined”، فإن هذا يعني أن المحرك قد قام برصد (hoisting) التعريف الخاص بالمتغير. في JavaScript، عملية الرفع (hoisting) تعني أن جميع التعريفات الخاصة بالمتغيرات والدوال في نطاق البرنامج تتم نقلها إلى الجزء العلوي من النطاق (scope) قبل تنفيذ أي كود. وبما أن تعريفات المتغيرات تتم رفعها، يمكنك الوصول إلى قيمتها قبل تعيين قيمة لها، وسيتم عرض “undefined” في هذه الحالة.

    على الجانب الآخر، عندما نقول أن المتغير “not defined”، فإن هذا يعني أن المحرك لم يستطع العثور على تعريف للمتغير في النطاق الحالي للبرنامج. وفي هذه الحالة، ستقوم JavaScript برمي خطأ “Uncaught ReferenceError” لإشعارك بأن المتغير غير معرف.

    أما بالنسبة للدوال، فإنها تُعامل بشكل مختلف. في JavaScript، فإن تعريفات الدوال تتم رفعها أيضًا، مما يعني أنه يمكنك استدعاء الدالة قبل تعريفها في الكود دون الحاجة إلى القلق بشأن “undefined” أو “not defined”. يُعتبر هذا التصرف ميزة في JavaScript ويسمح بتنظيم الشيفرة بشكل أكثر مرونة.

    إذا كان لديك أي استفسارات إضافية أو ترغب في المزيد من التوضيح، فلا تتردد في طرحها.

  • تأثير استخدام static في C

    عندما تقوم بتعريف دالة أو متغير كـ static في لغة البرمجة C، فإن ذلك يؤثر بشكل مباشر على كيفية تخصيص الذاكرة لهذه العناصر. بشكل عام، يمكن القول إن استخدام static يقلل من الحاجة إلى تخصيص وتحرير الذاكرة في كثير من الحالات، مما يعزز الأداء بشكل غير مباشر.

    عند تعريف دالة كـ static، يتم تخصيص الذاكرة اللازمة لهذه الدالة في مكانها الأصلي في الذاكرة (على العكس من الدوال العادية التي تتم تخصيصها في الذاكرة الحيوية). هذا يعني أنها لا تخلق نفسها مرة أخرى في كل مرة تُستدعى فيها، بل تبقى في الذاكرة طوال فترة تنفيذ البرنامج. هذا يؤدي إلى تقليل الحاجة إلى تخصيص وتحرير الذاكرة بشكل متكرر، مما يمكن أن يقلل من تكلفة إدارة الذاكرة ويحسن الأداء.

    بالنسبة للمتغيرات، عند تعريف متغير كـ static في دالة معينة، يعني ذلك أن قيمة هذا المتغير ستحتفظ بقيمتها بين مختلف استدعاءات الدالة، بدلاً من أن تفقد قيمتها مع نهاية كل استدعاء. هذا السلوك يعني أنه يمكن استخدام هذه المتغيرات بشكل أكثر فعالية وتوفيرًا للذاكرة، خاصة عندما يكون لديك متغيرات تحتاج إلى الاحتفاظ بقيمها بين استدعاءات متعددة لنفس الدالة.

    بشكل عام، عند استخدام static بشكل صحيح، يمكن أن يسهم في تحسين أداء البرنامج من خلال تقليل استخدام الذاكرة وتحسين كفاءة إدارتها. ومع ذلك، يجب أن تكون حذرًا عند استخدام static، لأنه يمكن أن يؤدي إلى سلوك غير متوقع في بعض الحالات، خاصة عند استخدامه بشكل غير صحيح.

    المزيد من المعلومات

    بالتأكيد، إليك المزيد من المعلومات حول كيفية تأثير static على تقليل استخدام الذاكرة في لغة البرمجة C:

    1. الحفاظ على القيمة بين الاستدعاءات: عند استخدام متغير محلي كـ static في دالة، يحتفظ المتغير بقيمته بين مختلف استدعاءات الدالة. هذا يمكن أن يكون مفيدًا إذا كان لديك متغير يحتاج إلى الاحتفاظ بقيمته بين استدعاءات متعددة.

    2. تقليل تكلفة إعادة تهيئة: عند استخدام دالة كـ static، لا يحدث تهيئة للدالة في كل مرة تُستدعى فيها. بدلاً من ذلك، تبقى الدالة في الذاكرة طوال فترة تنفيذ البرنامج، مما يقلل من تكلفة إعادة تهيئتها.

    3. تقليل الضغط على الذاكرة الحية: بما أن الدوال الـ static تتم تخصيصها في الذاكرة الثابتة، فإنها لا تسهم في زيادة الضغط على الذاكرة الحية (التي يتم تخصيصها وتحريرها بواسطة المدير الحيوي للذاكرة)، مما يمكن أن يساعد في تقليل احتياجات البرنامج للذاكرة الحية.

    4. تحسين أداء الحلقات الداخلية: عند استخدام static مع متغيرات داخل حلقة، يمكن أن يساعد في تقليل تكلفة تخصيص وتحرير الذاكرة في كل تكرار للحلقة، مما يمكن أن يؤدي إلى تحسين أداء الحلقة.

    5. تحسين الوصول للذاكرة: بما أن الدوال الـ static والمتغيرات الـ static تتم تخصيصها في الذاكرة الثابتة، فإن الوصول إليها قد يكون أسرع من الوصول إلى الدوال والمتغيرات العادية التي تتم تخصيصها في الذاكرة الحية.

    على الرغم من فوائد استخدام static في تقليل استخدام الذاكرة وتحسين الأداء، يجب أن تكون حذرًا عند استخدامه، خاصة عندما يتعلق الأمر بالتعامل مع متغيرات ودوال عديمة الربط (non-reentrant) أو الأكواد المتعددة الخيوط.

  • Passing Pointers to Functions in C

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

    عندما تستخدم مصفوفة مزدوجة البُعد (matrix)، فإنك بالفعل تمرر عنوان بداية المصفوفة، وليس نسخة منها. لذا، عند تعديل المصفوفة في الدالة، فإنك تعدل المصفوفة الأصلية أيضًا. لتجنب هذا، يجب عليك استخدام الإشارات (pointers) بشكل صحيح.

    التعديل الصحيح لدالتك هو كما يلي:

    c
    void stampmatrix(int **matrix, int dim) { int r=0, c=0; for(r=0; rprintf("("); for(c=0;c1; // تعديل المصفوفة الأصلية printf(" %d , ",matrix[r][c]); } printf(")"); } }

    هذا سيقوم بتعديل المصفوفة الأصلية بدلاً من إنشاء نسخة منها.

    المزيد من المعلومات

    بالطبع! في لغة C، عند تمرير مصفوفة إلى دالة، فإنك في الواقع تمرر عنوان أول عنصر في المصفوفة. وهذا يعني أن أي تعديل تقوم به في المصفوفة داخل الدالة سيؤثر على المصفوفة الأصلية التي تمررت إليها.

    إذا أردت تمرير نسخة من المصفوفة وتجنب تعديل المصفوفة الأصلية، يجب عليك استخدام نسخة من المصفوفة والتعديل عليها داخل الدالة. يمكنك القيام بذلك عن طريق إنشاء مصفوفة جديدة داخل الدالة ونسخ قيم المصفوفة الأصلية إليها. وهذا يتطلب تغيير توقيع الدالة لتستقبل المصفوفة كقيمة وليس كإشارة.

    هناك طرق مختلفة لتحقيق هذا الهدف، وإليك كيفية فعل ذلك باستخدام ذاكرة ديناميكية للمصفوفة الجديدة:

    c
    void stampmatrix(int **matrix, int dim) { int r=0, c=0; int **newMatrix; // تخصيص ذاكرة للمصفوفة الجديدة newMatrix = (int **)calloc(dim, sizeof(int *)); for(r=0; rint *)calloc(dim, sizeof(int)); } // نسخ قيم المصفوفة الأصلية إلى المصفوفة الجديدة for(r=0; rfor(c=0; c// طباعة المصفوفة الجديدة for(r=0; rprintf("("); for(c=0; cprintf(" %d , ", newMatrix[r][c]); } printf(")"); } // حرر الذاكرة المخصصة للمصفوفة الجديدة for(r=0; rfree(newMatrix[r]); } free(newMatrix); }

    هذا الكود يقوم بإنشاء نسخة من المصفوفة الأصلية ويعمل على هذه النسخة داخل الدالة دون أن يؤثر على المصفوفة الأصلية.

  • تأكيد ترتيب تحميل السكربتات في JSFiddle

    عند تجربة الرابطين اللذين قمت بمشاركتهما، يظهر أن السبب الرئيسي لعدم عمل الكود في JSFiddle هو ترتيب تحميل السكربتات. في CodePen، يقوم الموقع تلقائيًا بتضمين السكربتات في الجزء الصحيح من صفحة HTML، مما يجعل السكربت الخاص بك يعمل بشكل صحيح. أما في JSFiddle، يمكن أن تؤثر عملية تحميل السكربتات الخارجية في تنفيذ الكود بشكل صحيح.

    لحل هذه المشكلة في JSFiddle، يمكنك تغيير إعدادات التحميل لجعل الكود يعمل بنفس الطريقة التي يعمل بها في CodePen. يمكنك فعل ذلك عن طريق تغيير إعدادات التحميل من “onLoad” إلى “No wrap – in ” أو “No wrap – in ” من قائمة “JavaScript” في JSFiddle.

    بعد تغيير هذه الإعدادات، يجب أن يعمل الكود بنفس الطريقة التي يعمل بها في CodePen.

    المزيد من المعلومات

    بالتأكيد! إضافةً إلى ما ذكرته حول ترتيب تحميل السكربتات، هناك عوامل أخرى قد تؤثر على عمل الكود في JSFiddle بشكل مختلف عن CodePen:

    1. إعدادات الإعتمادية (Dependencies): في JSFiddle، يمكنك إضافة مكتبات أو إطارات عمل (Frameworks) إلى مشروعك من خلال إعدادات الإعتمادية. قد تحتاج إلى التأكد من أن الإصدارات المستخدمة متوافقة مع بعضها البعض، حيث أن تضمين إصدار غير متوافق قد يؤثر على عمل الكود.

    2. الإعدادات العامة للصفحة (Page Settings): يمكنك تعيين إعدادات عامة للصفحة في JSFiddle مثل لغة HTML وCSS وJavaScript. تأكد من أن الإعدادات تتوافق مع متطلبات الكود الذي تحاول تشغيله.

    3. الأخطاء في الكود: تأكد من أن الكود المكتوب لا يحتوي على أخطاء تعطل تنفيذه. قد تحتاج إلى فحص وتصحيح الأخطاء البرمجية قبل أن يعمل الكود بشكل صحيح.

    باستكشاف هذه العوامل ومراجعة إعدادات JSFiddle الخاصة بمشروعك، يجب أن تتمكن من تشغيل الكود بنجاح مثلما يحدث في CodePen.

  • ما هي الطرق Implicit Conversions في سكالا Scala؟

    Implicit Conversions هي طريقة في سكالا تسمح لنا بتحويل نوع البيانات الخاص بنا إلى نوع آخر بشكل ضمني. يتم استخدام هذه الطريقة من أجل توفير المرونة في البرمجة وتبسيط الأكواد.

    هناك نوعان من Implicit Conversions في سكالا:

    1- Implicit Conversions القياسية: هي التحويلات التي يوفرها سكالا بشكل افتراضي وتتم عبر import بعض المكتبات الخاصة مثل scala.language.implicitConversions.

    2- Implicit Conversions المخصصة: هي التحويلات التي يتم تعريفها بواسطة المبرمج نفسه وتتم عبر تعريف دوال ضمنيّة (implicit functions) يتم استدعاؤها تلقائيا عند الحاجة.

    مثال على Implicit Conversions:

    يمكن استخدام Implicit Conversions لتحويل قيمة من نوع Int إلى نوع Double بشكل ضمني، مثلا:

    “`scala
    implicit def intToDouble(i: Int): Double = i.toDouble

    val x: Int = 5
    val y: Double = x // هنا يتم تحويل القيمة x من نوع Int إلى نوع Double ضمنياً
    “`

    تم إنشاء دالة ضمنية implicit def intToDouble() وتم تحويل القيمة من نوع Int إلى نوع Double ضمنياً. وبذلك، يمكننا استخدام القيمة x من نوع Int بشكل طبيعي كنوع Double.

  • ما هي الـ Traits في سكالا وكيف تعمل؟

    Traits هي ميزة قوية في لغة سكالا وتستخدم لتعريف مجموعة من السمات المشتركة بين الكائنات. وهي عبارة عن قالب يتم استخدامه لإنشاء classes أو objects.

    يمكن استخدام Traits لتعريف سمات جديدة للكائنات دون الحاجة إلى تغيير التركيبة النوعية للكائنات. ويمكن استخدامها لتوفير تطبيقات متعددة للكائنات وتقليل حجم الكود الذي يتم إنشاؤه.

    على سبيل المثال، إذا كان لدينا عدة كائنات مختلفة (مثل الحيوانات) وتريد تعريف بعض السمات المشتركة بينها (مثل القدرة على الحركة) ، فيمكن استخدام Trait لتعريف هذه السمات وإعادة استخدامها في كل من الكائنات.

    توفر Traits في سكالا العديد من الميزات مثل:

    – تمكين الإرث المتعدد: يمكن للكائنات استخدام Traits إضافية لإضافة المزيد من السمات.
    – تحسين إعادة الاستخدام: يمكن إعادة استخدام Traits في العديد من الكائنات المختلفة.
    – تعزيز القدرة على البرمجة الوظيفية: يمكن استخدام Traits لإنشاء mixin functions والتي يمكن تطبيقها على الكائنات في وقت التشغيل.

  • ما هو الـ Type Bounds في سكالا (Scala) وكيف يتم استخدامها؟

    Type Bounds في سكالا (Scala) هي طريقة لوضع حدود على نطاق الأنواع (types) التي يمكن استخدامها في المتغيرات والأدوات الجرأية (methods) والوظائف (functions).

    تتضمن Type Bounds حدًا أدنى و حدًا أقصى لنطاق الأنواع المسموح بها للبيانات. على سبيل المثال، يمكن وضع حد أدنى للنوع بحيث يتعين على النوع المناسب تنفيذ بعض الوظائف الخاصة ، أو وضع حد أقصى للنوع بحيث لا يتم تنفيذ الأدوات الجرأة على نوع غير صالح.

    لإضافة Type Bounds الأدنى، يمكن استخدام العلامات <:

    مثال:
    “`
    def findMax[T <: Comparable[T]](a: T, b: T): T = {
    if (a.compareTo(b) > 0) a else b
    }
    “`

    تعني هذه الدالة أن النوع الذي يتم استخدامه في “a” و “b” لا يمكن أن يكون أقل من Comparable[T].

    و لإضافة Type Bounds الأقصى، يمكن استخدام العلامات >:

    مثال:
    “`
    def someMethod[T >: Null](arg: T): Unit = {
    // do something with arg
    }
    “`

    تعني هذه الدالة أن النوع الذي يتم استخدامه في “arg” لا يمكن أن يكون أعلى من Null.

  • ما هي أساسيات برمجة سكالا (Scala)؟

    تعد Scala من اللغات البرمجية ذات المستوى العالي، وهي منزوعة المصدر (Open Source) وتعتمد على جافا (Java)، يمكن استخدامها لتطوير تطبيقات الويب وتطبيقات سطح المكتب المتطورة.

    أن هناك عددًا من الأساسيات في برمجة Scala، تشمل:

    1- المتغيرات (Variables) والنوعية (Data Types) والثوابت (Constants).
    2- العمليات الحسابية الأساسية، مثل الجمع والطرح والضرب والقسمة.
    3- العمليات المنطقية، مثل العمليات الشرطية (If Statements) والعمليات الحلقية (Loops).
    4- الكائنات (Objects) والكلاسات (Classes)، والأبناء والموروثات (Inheritance).
    5- التعامل مع القوائم (Lists) والمصفوفات (Arrays) والمجموعات (Sets)، والنماذج (Maps).
    6- الدوال (Methods) والمتغيرات المنطوقة (Lambda expressions) والقوائم المجهولة (Anonymous functions).

    وبالإضافة إلى ذلك، يتميز برمجة Scala بــ:

    1- دعمه لبرمجة شؤون المحرك (Concurrent programming) وتعدد المهام(Multithreading).
    2- دعمه التام للجافا (Java)، مما يمكن المستخدمين من الاستفادة من جميع مكتبات جافا ومراقبة الإيكوليبس.
    3- استخدام قواعد المسافة البيضاء (Whitespace) بدلًا من الأقواس لتحديد نطاق العبارات والأقواس.
    4- دعم البرمجة الوظيفية والأمنة.

    بإمكانك الاطلاع على دليل البدء بلغة Scala لمزيد من المعلومات والتعلم من خلال تجربة اللغة بنفسك.

  • ما هي أساسيات سكالا؟

    1- النص التعبيري (Expressions)
    2- المتغيرات (Variables)
    3- الدوال (Functions)
    4- التعابير المشتقة (Derived Expressions)
    5- الكائنات (Objects)
    6- الرقع (Patches)
    7- الكائنات العلوية (Upper Bounds)
    8- الملاحظات (Annotations)
    9- النماذج (Classes and Traits)
    10- التراكيب التحكمية (Control Structures)

  • ما هي الأساليب (Methods) في سكالا (Scala)؟

    تكون الأساليب (Methods) في سكالا مشابهة للدوال (Functions) في لغات البرمجة الأخرى، حيث تقوم بتنفيذ مجموعة من الأوامر ضمن نطاق معين وتستقبل مدخلات وترجع قيمًا.

    تتميز الأساليب في سكالا بالنقاط الآتية:

    1- قدرة الأساليب في سكالا على تعيين قيم الحالة الداخلية لمختلف الكائنات.

    2- الأساليب قابلة للاستدعاء من دواخل الدوال والأساليب.

    3- يمكن استدعاء الأساليب من الكائنات مباشرة.

    4- يمكن استخدام الأساليب للاستجابة للأحداث المختلفة.

    5- يتميز الأسلوب في سكالا بالقدرة على قبول المعاملات الاسمية والمعاملات الحرفية.

    6- الأساليب في سكالا تستطيع استرداد مجموعة من القيم الخاصة بها، تعاملها بشكل تام مع المتغيرات و المعاملات.

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر