كود المواجهة: روبي ضد جافاسكريبت

روبي وجافا سكريبت على وشك الذهاب وجها لوجه. يتم كتابة كل من لغات البرمجة النصية هذه بشكل ديناميكي ودعم البرمجة الموجهة للكائنات. سنقوم بدراسة الاختلافات أو أوجه التشابه بينهما عبر بعض ميزاتها الأكثر شيوعًا.

إخلاء المسؤولية: نحن نبحث فقط في بناء جملة JavaScript ES6 الحديث هنا.

الصورة بواسطة Pramote Polyamate على 500px

سلسلة الاستيفاء

في برمجة الكمبيوتر ، يعد الاستيفاء بالسلسلة عملية حقن قيمة متغير أو تعبير في سلسلة حرفية.

في روبي ، وهذا ما يسمى ، خمنت ذلك ، سلسلة الاستيفاء.

روبي:

first_name = "مارتن"
last_name = "Riggs"
يضع "مرحبًا ، أنا # {first_name} # {last_name}."

في Javascript ، يمكن تحقيق نفس الشيء باستخدام القوالب الحرفية.

جافا سكريبت:

const الاسم الأول = 'مارتن' ؛
const lastName = 'Riggs' ؛
console.log (`مرحبًا ، أنا $ {firstName} $ {lastName} .`) ؛

الطرق والوظائف

تشرح Wikipedia أنه في برمجة الكمبيوتر ، تعتبر الروتين الفرعي عبارة عن سلسلة من إرشادات البرنامج التي تؤدي مهمة محددة ، يتم تعبئتها كوحدة. يمكن بعد ذلك استخدام هذه الوحدة في البرامج حيثما يجب تنفيذ هذه المهمة المحددة.

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

من أجل استخدامها ، يجب تعريف هذه الروتين الفرعي أولاً ثم استدعاؤها. في روبي ، تُعرف بالطرق وفي جافا سكريبت ، يطلق عليها وظائف.

روبي:

def full_name (first_name ، last_name)
  "# {first_name.capitalize} # {last_name.capitalize}"
النهاية
يضع full_name ("beatrix" ، "kiddo")

جافا سكريبت:

وظيفة الاسم الكامل (الاسم الأول ، اسم العائلة) {
  إرجاع `$ {firstName.capitalize ()} $ {lastName.capitalize ()}`؛
}؛
console.log (fullName ("beatrix"، "kiddo"))؛

إذا كنت تقوم بتشغيل الأمثلة أعلاه ، فمن المحتمل أنك لاحظت أن مثال JavaScript لا يعمل ، ولكن يلقي خطأ: لم يتم اكتشاف TypeError: firstName.capitalize ليس وظيفة!

وذلك لأن جافا سكريبت لا تحدد وظيفة الكتابة بالأحرف الكبيرة أصلية. لدى روبي العديد من الطرق الاصطلاحية المفيدة والأنيقة مثل #capitalize التي هي مريحة حقًا. لجعل المثال أعلاه يعمل ، سنحتاج إلى استخدام سلسلة النموذج الأولي (تصحيح القرد) في كائن JavaScript String:

String.prototype.capitalize = function () {
  إرجاع this.charAt (0) .toUpperCase () + this.slice (1)؛
}

كتل

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

روبي:

توقيت مواطنه
  start_time = Time.now
  يضع "كتلة قيد التشغيل ..."
  
  يخضع أو يستسلم
  يضع "انتهى!"
  end_time = Time.now - start_time
  "وقت التنفيذ: # {end_time}"
النهاية
يضع جهاز ضبط الوقت {(0..10000000) .sort}

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

جافا سكريبت:

وظيفة توقيت (رد الاتصال) {
  const startTime = تاريخ جديد (). getTime () ؛
  console.log ("Running callback ...")؛
  
  أتصل مرة أخرى()؛
  console.log ( "انتهى!")؛
  const endTime = تاريخ جديد (). getTime ()؛
  إرجاع `وقت التنفيذ: $ {endTime - startTime}`؛
}؛
timer (() => Array.from (Array (10000000) .keys ()). sort ())؛

ملاحظة: على عكس Ruby ، ​​لا يحتوي JavaScript على كائن Range مدمج. إرجاع Array.from (Number) .keys () أعلاه صفيف من 0 إلى رقم.

التكرارات الاصطلاحية

يشتهر روبي بوجود متكرارات اصطلاحية لطيفة جدًا لتدوينها عبر المصفوفات (وغيرها من التعدادات أو الهياكل التكرارية).

روبي:

أسماء = ["Tango" ، "Cash" ، "Dalton" ، "Riggs"]
names.each تفعل | اسم |
  يضع الاسم
النهاية

مع ES6 ، يصبح التكرار من خلال صفيف في JavaScript نسيمًا:

جافا سكريبت:

أسماء const = ['Tango' ، 'Cash' ، 'Dalton' ، 'Riggs'] ؛
names.forEach (name => console.log (name)) ؛

ملاحظة: يمكن أيضًا لوظيفة Javascript forEach الوصول إلى فهرس العنصر. في روبي ، نستخدم مكررًا مختلفًا لما يسمى each_with_index.

الطبقات والميراث الطبقي

في Object-Oriented Programming ، تعتبر الفئات قوالب تعليمات برمجية لإنشاء كائنات ، وتقدم قيمًا للحالة (خصائص الكائن أو سماته) وسلوك التنفيذ (مثل getters والمستقرون لقراءة وكتابة هذه الخصائص أو السمات).

روبي:

فئة السيارة
  تهيئة def (الاسم ، النوع)
    @ اسم = الاسم
    @ النوع = النوع
  النهاية
  اسم مواطنه
    @اسم
  النهاية
  نوع مواطنه
    @نوع
  النهاية
النهاية
فئة السيارات <مركبة
  تهيئة def (الاسم)
   رائع (الاسم ، "سيارة")
  النهاية
النهاية
diablo = Car.new ("Lamborghini")
يضع diablo.name
يضع diablo.type

جافا سكريبت:

فئة السيارة
 
  مُنشئ (الاسم ، النوع) {
    this.name = الاسم ؛
    this.type = النوع ؛
  }
 
  getName () {
    إرجاع this.name ؛
  }
 
  getType () {
    إرجاع this.type ؛
  }
 
}
كلاس تمدد السيارة
 
  مُنشئ (الاسم)
    السوبر (الاسم ، 'سيارة') ؛
  }
}
const ديابلو = سيارة جديدة ('لامبورغيني') ؛
console.log (diablo.getName ())؛
console.log (diablo.getType ())؛

ملاحظة: في المثال أعلاه ، يتم عادةً تنفيذ فئة Ruby Vehicle باستخدام قارئ سمة لإنشاء أساليب getter لمتغيرات المثيل. لقد اخترت عدم استخدام قارئ سمات حتى يكون هناك مظهر أكثر تشابهًا لتطبيق JavaScript.

الإتلاف

قامت JavaScript الحديثة بتقديم هذا الشيء الرائع الذي يدعى "التدمير" ، حيث يمكنك تعيين عناصر داخل المصفوفات أو الكائنات لمتغيرات باستخدام بناء جملة مختصرة.

جافا سكريبت:

firstName ، اسم العائلة = 'James Bond'.split ()؛
console.log (`اسمي $ {lastName} ، $ {firstName} $ {lastName}`) ؛

بالتأكيد لا يمكنك القيام بذلك في روبي!

روبي:

first_name ، last_name = "James Bond" .split
يضع "اسمي # {last_name} ، # {first_name} # {last_name}"

ملاحظة: على الرغم من أننا نستطيع تدمير الصفائف في روبي تمامًا كما نفعل في جافا سكريبت ، لا يوجد روبي مكافئ لتجزئة البنى المباشرة.

انتشار المشغل

قامت JavaScript الحديثة أيضًا بتقديم مشغل الانتشار الذي يسمح بتوسيع التعبيرات القابلة للتكرار حيث من المتوقع وجود وسيطات أو عناصر أو أكثر.

جافا سكريبت:

مجموع الدوال (x ، y ، z) {
  إرجاع x + y + z ؛
}؛
أرقام const = [1 ، 2 ، 3] ؛
console.log (مبلغ (... أرقام)؛
[a، b، ... rest] = [10 ، 20 ، 30 ، 40 ، 50] ؛
console.log (أ)؛
console.log (ب)؛
console.log (بقية). / / الراحة هي صفيف!

في روبي ، لدينا المشغل splat لهذا.

روبي:

مبلغ def (x ، y ، z)
  س + ص + ض
النهاية
الأرقام = [1 ، 2 ، 3]
يضع المبلغ (* الأرقام)
أ ، * الراحة ، ب = [10 ، 20 ، 30 ، 40 ، 50]
يضع
يضع ب
يضع الراحة # الراحة هي مجموعة!

ملاحظة: ربما لاحظت أن في روبي * الباقي هو بين المتغيرات الأخرى. هذا هو المشغل splat الذي يمكن وضعه في أي مكان بين المتغيرات. في JavaScript ، يجب أن يأتي عامل الانتشار في النهاية.

يوجد لدى روبي أيضًا عامل التشغيل المضاعف ** للقيام بنفس الشيء على التجزئات. تعمل مواصفات JavaScript ES2018 على تقديم معامل الانتشار على الكائنات أيضًا.

كلمة أخيرة

بما أنك قد أدركت على الأرجح ، فإن اللغتين لا تختلفان كثيرًا بعد كل شيء ، ومع ES6 ، أصبح جافا سكريبت أكثر متعة في الكتابة. بالتأكيد ، JavaScript هي لغة المستعرض وتوفر حلقة الأحداث الخاصة به سلوكًا غير متزامن. من ناحية أخرى ، لدى روبي أدوات قوية جدًا للقيام بعملية البرمجة الكهربية وهي محبوبة في بناء الجملة الاصطلاحية. في نهاية النهاية ، أعتقد أنه من المفيد أن نتعلم ونعرف على حد سواء حيث أن المعرفة بلغة برمجة ستمنحك في كثير من الأحيان أفكارًا حول كيفية تدوين مشكلة معينة أو معالجتها في لغة أخرى.