کد مقدماتی: روبی در مقابل Javascript

روبی و جاوا اسکریپت قصد دارند سر به سر روند. هر دو زبان اسکریپت نویسی به صورت پویا تایپ شده اند و از برنامه نویسی شی گرا پشتیبانی می کنند. ما تفاوتها یا شباهتهای آنها را در مورد برخی از ویژگیهای متداول آنها بررسی خواهیم کرد.

سلب مسئولیت: ما فقط در اینجا به بررسی نحو مدرن JavaScript ES6 می پردازیم.

عکس توسط Pramote Polyamate در 500px

درون یابی رشته ای

در برنامه نویسی رایانه ای ، درون یابی رشته ای فرایند تزریق مقدار یک متغیر یا یک عبارت در یک لفظ رشته است.

شما در حد آن را حدس می زنید ، Ruby ، ​​آن را حدس زده اید ، درون یابی رشته ای.

یاقوت:

first_name = "مارتین"
last_name = "ریگ"
"سلام ، من # {first_name # {آخرین_نام puts هستم."

در Javascript ، همین کار را می توان با الفبای الگوی انجام داد.

JavaScript:

const firstName = 'مارتین'؛
const lastName = 'Riggs'؛
console.log ("سلام ، من $ {firstName} $ {نام خانوادگی` هستم. ")؛

روش ها و عملکردها

ویکی پدیا توضیح می دهد که ، در برنامه نویسی رایانه ، یک زیر برنامه دنباله ای از دستورالعمل های برنامه است که یک کار خاص را انجام می دهد ، بسته بندی شده به عنوان یک واحد. این واحد می تواند در هر کجا که کار خاص انجام شود ، استفاده شود.

در زبانهای مختلف برنامه نویسی ، یک زیر برنامه ممکن است یک رویه ، یک عملکرد ، روال ، یک روش یا یک زیر برنامه خوانده شود.

برای استفاده ، ابتدا باید این زیرآبی ها تعریف و سپس فراخوانده شوند. در Ruby ، ​​آنها به عنوان روش شناخته می شوند و در JavaScript ، توابع نامیده می شوند.

یاقوت:

def full_name (first_name، last_name)
  "# {first_name.capitalize} # {last_name.capitalize}"
پایان
قرار می دهد full_name ("beatrix" ، "kiddo")

JavaScript:

تابع کامل نام (نام خانوادگی ، نام خانوادگی) {
  Return `$ {firstName.capitalize () $ {lastName.capitalize ()`؛
؛
console.log (fullName ("beatrix" ، "kiddo"))؛

اگر نمونه های بالا را اجرا می کنید ، حتماً توجه کرده اید که نمونه JavaScript کار نمی کند ، اما خطایی را به همراه دارد: Uncaught TypeError: firstName.capitalize یک تابع نیست!

این بدان دلیل است که جاوا اسکریپت یک عملکرد بزرگ را بومی تعریف نمی کند. روبی روشهای ایدیوماتیک مفید و مرتب زیادی مانند #capitalize دارد که واقعاً مناسب هستند. برای اینکه مثال بالا کار شود ، باید از زنجیره نمونه اولیه (پچ میمون) در شیء JavaScript String استفاده کنیم:

String.prototype.capitalize = عملکرد ()
  این را برگردانید .charAt (0) .toUpperCase () + this.slice (1)؛
}

بلوک

در Ruby ، ​​بلوک ها در واقع تکه های کد نامگذاری نشده ای هستند که می توانند به آنها منتقل شوند و از روشهای داخل فراخوانی شوند. بسیاری از روش های شیء داخلی در Ruby بلوک ها را می پذیرند و این یک روش مناسب برای ترساندن نحوه رفتار این روش ها است.

یاقوت:

تایمر دف
  start_time = زمان.حال
  "بلوک در حال اجرا ..."
  
  بازده
  "پایان یافت!"
  end_time = Time.now - start_time
  "زمان اجرا: # {end_time}"
پایان
تایمر را قرار می دهد {(0..10000000). مرتب سازی

سلام ، جاوا اسکریپت بلوک ندارد ، بنابراین اجرای فوق امکان پذیر نیست و مقایسه احمقانه است! یا آن؟ توابع جاوا اسکریپت می توانند عملکردهای پاسخ به کار را به عنوان آرگومان بپذیرند و اگر به بلوک های روبی فکر کنیم که بسیار شبیه روش های ناشناس است می توانیم به نتیجه مشابهی برسیم.

JavaScript:

تایمر عملکرد (پاسخ به تماس) {
  const startTime = تاریخ جدید (). getTime ()؛
  console.log ("اجرای برگشت پاسخ ...")؛
  
  پاسخ به تماس ()؛
  console.log ("تمام شد!")؛
  const endTime = تاریخ جدید (). getTime ()؛
  بازگشت `زمان اجرا: $ {endTime - startTime}`؛
؛
تایمر (() => Array.from (Array (10000000) .keys ()). مرتب سازی ())؛

توجه: بر خلاف روبی ، جاوا اسکریپت یک شیء محدوده داخلی ندارد. کلیدهای Array.from (Number) .key () بالا یک Array را از 0 به Number برمی گرداند.

تکرار ایدیوماتیک

روبی به دلیل دارا بودن تکرارهای ایدیوماتیک بسیار خوب برای حلقه کردن Arrays (و سایر شمارش های بیشمار یا ساختارهای تکراری) شناخته شده است.

یاقوت:

names = ["Tango"، "Cash"، "Dalton"، "Riggs"]
names.each do | name |
  نام می گذارد
پایان

با ES6 ، تکرار از طریق آرایه ای در JavaScript به نسیم تبدیل می شود:

JavaScript:

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

توجه: عملکرد Javascript forEach همچنین می تواند به فهرست عناصر دسترسی پیدا کند. در Ruby ، ​​از یک تکرارکننده متفاوت برای آنچه به نام each_with_index استفاده می شود استفاده می کنیم.

کلاسها و ارث طبقاتی

در برنامه نویسی شی گرا ، کلاس ها الگوهای کد برای ایجاد اشیاء ، ارائه مقادیر حالت (ویژگی ها یا ویژگی های شیء) و اجرای رفتار (مانند گیرنده ها و تنظیم کننده ها برای خواندن و نوشتن چنین ویژگی ها یا ویژگی هایی هستند).

یاقوت:

وسیله نقلیه کلاس
  شروع اولیه (نام ، نوع)
    name = نام
    type = نوع
  پایان
  نام دف
    @نام
  پایان
  نوع دف
    type
  پایان
پایان
کلاس اتومبیل <وسایل نقلیه
  def کردن اولیه (نام)
   فوق العاده (نام ، "ماشین")
  پایان
پایان
diablo = Car.new ("لامبورگینی")
diablo.name را قرار می دهد
diablo.type را قرار می دهد

JavaScript:

کلاس وسیله نقلیه
 
  سازنده (نام ، نوع) {
    this.name = نام؛
    this.type = نوع؛
  }
 
  getName ()
    این را برگردانید.
  }
 
  getType ()
    این را برگردانید.
  }
 
}
کلاس اتومبیل خودرو را گسترش می دهد {
 
  سازنده (نام)
    فوق العاده (نام ، "ماشین")؛
  }
}
const diablo = Car New ('Lamborghini')؛
console.log (diablo.getName ())؛
console.log (diablo.getType ())؛

توجه: در مثال بالا ، کلاس Ruby Vehicle به طور معمول با یک ویژگی خواننده اجرا می شود تا روش های گیرنده را برای متغیرهای نمونه ایجاد کند. من تصمیم گرفتم از ویژگی خواننده استفاده نكنم تا ظاهری شبیه به اجرای JavaScript داشته باشد.

تخریب

جاوا اسکریپت مدرن این چیزهای بسیار جالب را با عنوان مخرب ارائه کرده است ، که در آن می توانید عناصر داخل آرایه ها یا اشیاء را به متغیرهایی با یک ترکیب مختصر اختصاص دهید.

JavaScript:

firstName، lastName = 'James Bond'.split ()؛
console.log (`نام من $ {نام خانوادگی} ، $ {نام خانوادگی} $ {نام خانوادگی)`) است.

مطمئناً شما نمی توانید این کار را در روبی انجام دهید!

یاقوت:

first_name، last_name = "جیمز باند" .split
"نام من # {آخرین_نام} ، # {نام_ {# {آخرین_نام {است"

توجه: در حالی که ما می توانیم آرایه ها را در Ruby بسیار شبیه به JavaScript انجام دهیم ، هیچ معادل Ruby با هش های مستقیم زیرساخت وجود ندارد.

پخش اپراتور

جاوا اسکریپت مدرن همچنین اپراتور گسترش را معرفی کرده است که اجازه می دهد تا در صورت انتظار آراء یا عناصر صفر یا بیشتر ، گسترش یابد.

JavaScript:

مقدار تابع (x ، y ، z)
  بازگشت x + y + z؛
؛
const number = [1، 2، 3]؛
console.log (جمع (... شماره)؛
[a، b، ... rest] = [10، 20، 30، 40، 50]؛
console.log (a)؛
console.log (b)؛
console.log (استراحت)؛ // استراحت یک Array است!

در روبی ، ما اپراتور splat را برای این کار داریم.

یاقوت:

مبلغ دف (x، y، z)
  x + y + z
پایان
اعداد = [1 ، 2 ، 3]
جمع می کند (* شماره)
a، * استراحت، b = [10، 20، 30، 40، 50]
قرار می دهد
قرار می دهد ب
استراحت می گذارد # استراحت یک Array است!

توجه: احتمالاً متوجه شده اید که در Ruby * استراحت بین متغیرهای دیگر است. این عملگر splat را می توان در هر نقطه ای از متغیرها قرار داد. در JavaScript ، اپراتور گسترش باید آخرین باری باشد.

روبی همچنین دارای دو اپراتور splat ** است که می تواند همین کار را روی هش انجام دهد. مشخصات JavaScript ES2018 اپراتور گسترش را بر روی اشیاء نیز معرفی می کند.

حرف آخر

همانطور که احتمالاً فهمیدید ، هر دو زبان خیلی متفاوت نیستند و با ES6 ، جاوا اسکریپت نوشتن آن به طور فزاینده ای خوشایند تر شده است. مطمئناً جاوا اسکریپت زبان مرورگر است و حلقه رویداد آن رفتار ناهمزمان را ارائه می دهد. از طرف دیگر ، روبی ابزارهای بسیار قدرتمندی برای انجام برنامه نویسی metaprograming دارد و به دلیل اصطلاحات اصیل آن محبوب است. در پایان ، فکر می کنم یادگیری و دانستن هر دو مفید باشد زیرا اغلب دانش یک زبان برنامه نویسی به شما ایده هایی در مورد نحوه رمزگذاری یا مقابله با یک مشکل خاص در زبان دیگر می دهد.