Kod Göstəriş: Ruby vs Javascript

Ruby və JavaScript başdan-ayağa getməyə hazırlaşır. Bu skript dillərinin hər ikisi dinamik şəkildə yazılmışdır və obyekt yönümlü proqramlaşdırmanı dəstəkləyir. Onların fərqli və ya oxşarlıqlarını bəzi daha çox yayılmış xüsusiyyətlər arasında araşdıracağıq.

İmtina: Burada yalnız müasir JavaScript ES6 sintaksisinə baxırıq.

500px-də Pramote Polyamate-nin şəkli

String interpolasiya

Kompüter proqramlaşdırmasında simli interpolasiya dəyişənin və ya bir simvolun hərfi bir ifadənin dəyərinin vurulması prosesidir.

Ruby-də bu adlanır, siz təxmin etdiniz, simli interpolasiya.

Yaqut:

first_name = "Martin"
last_name = "Riggs"
qoyur "Salam, mən # {ilk_name} # {son_name}".

Javascript-də eyni şey şablon hərflərlə əldə edilə bilər.

JavaScript:

const firstName = 'Martin';
const lastName = 'Riggs';
console.log (`Salam, mən $ {firstName} $ {lastName}. ');

Metodlar və funksiyalar

Vikipediya izah edir ki, kompüter proqramlaşdırmasında alt proqram müəyyən bir tapşırıq yerinə yetirən, vahid kimi qablaşdırılan proqram tapşırıqlarının ardıcıllığıdır. Bu bölmədən sonra həmin tapşırığın yerinə yetirilməli olduğu yerlərdə proqramlarda istifadə edilə bilər.

Müxtəlif proqramlaşdırma dillərində bir alt proqram prosedur, bir funksiya, gündəlik, metod və ya alt proqram adlandırıla bilər.

İstifadəsi üçün bu alt proqramları əvvəlcə müəyyənləşdirmək və sonra çağırmaq lazımdır. Ruby-də onlar metod kimi tanınır və JavaScript-də funksiyalar adlanır.

Yaqut:

def full_name (ilk adı, soyadı)
  "# {ilk_ ad.capitalize} # {son_name.capitalize}"
son
full_name qoyur ("beatrix", "kiddo")

JavaScript:

funksiya fullName (firstName, lastName) {
  qayıtmaq $ $ firstName.capitalize ()} $ {lastName.capitalize ()} ';
};
konsol.log (fullName ("beatrix", "Kiddo"));

Yuxarıdakı nümunələri işlədirsinizsə, yəqin ki, JavaScript nümunəsinin işləmədiyini gördünüz, lakin səhv buraxdı: Uncaught TypeError: firstName.capitalize bir funksiya deyil!

Bunun səbəbi JavaScript yerli olaraq kapitallaşdırma funksiyasını təyin etməməsidir. Yaqutun həqiqətən rahat olan #capitalize kimi bir çox lazımlı və səliqəli idiomatik üsulu var. Yuxarıdakı nümunəni işləmək üçün JavaScript String obyektindəki prototip zəncirindən (meymun patch) istifadə etməliyik:

String.prototype.capitalize = funksiya () {
  this.charAt (0) .toUpperCase () + this.slice (1) qayıt.
}

Bloklar

Yaqutda, bloklar, əsasən metodlara ötürülə bilən və adlandırıla bilən kod dəstləridir. Ruby-də quraşdırılmış obyekt metodlarının çoxu blokları qəbul edir və bunlar bu metodların davranış qaydalarını düzəltmək üçün əlverişli bir yoldur.

Yaqut:

def timer
  start_time = Zaman.now
  qoyur "Çalışan blok ..."
  
  məhsuldarlıq
  qoyur "Hazır!"
  son_time = Vaxt.now - başlanğıc vaxtı
  "İcra müddəti: # {bitmə vaxtı}"
son
taymer qoyur {(0..10000000) .sort}

Hey, JavaScript-in blokları yoxdur, buna görə yuxarıdakı tətbiq mümkün deyil və müqayisə axmaqdır! Yoxsa? JavaScript funksiyaları geri çağırış funksiyalarını dəlillər kimi qəbul edə bilər və əgər Ruby bloklarını anonim metodlar kimi qiymətləndiririksə, oxşar nəticəyə nail ola bilərik.

JavaScript:

funksiya timer (geri zəng) {
  const startTime = yeni tarix (). getTime ();
  console.log ("Çağırış geri işləyir ...");
  
  geri zəng et();
  console.log ("Bitdi!");
  const endTime = yeni tarix (). getTime ();
  qayıtmaq 'İcra müddəti: $ {endTime - startTime}';
};
timer (() => Array.from (Array (10000000) .keys ()). sort ());

Qeyd: Yaqutdan fərqli olaraq JavaScript-də daxili Range obyekti yoxdur. Yuxarıdakı Array.from (Say) .keys () bir Arrayı 0-dan Nömrəyə qaytarır.

İdiomatik iterasiyalar

Yaqut, Arrays (və digər sayğaclar və ya iterativ strukturlar) vasitəsilə çox gözəl idiomatik iteratorların olması ilə məşhurdur.

Yaqut:

adlar = ["Tango", "Pul", "Dalton", "Riggs"]
adlar.each do | adı |
  ad qoyur
son

ES6 ilə, JavaScript-də bir sıra vasitəsilə iterasiya bir külək olur:

JavaScript:

const adları = ['Tango', 'Pul', 'Dalton', 'Riggs'];
adlar.forEach (name => console.log (name));

Qeyd: Javascript forEach funksiyası da elementin indeksinə daxil ola bilər. Ruby-də, hər_with_index adlanan başqa bir iterator istifadə edərdik.

Dərslər və sinif irsi

Obyekt-yönümlü proqramlaşdırmada dərslər, obyektlər yaratmaq, vəziyyət (obyektin xassələri və ya atributları) üçün dəyər verən və davranışları həyata keçirən kodeks şablonlarıdır (məsələn, bu cür xüsusiyyətlər və ya atributları oxumaq və yazmaq üçün qazanlar və tənzimləyicilər).

Yaqut:

sinif Vasitə
  def initialize (adı, növü)
    @ ad = ad
    @ tip = növü
  son
  def adı
    @ ad
  son
  def növü
    @ tip
  son
son
sinif Avtomobil 
diablo = Car.new ("Lamborghini")
diablo.name qoyur
diablo.type qoyur

JavaScript:

sinif Vasitə {
 
  konstruktor (adı, növü) {
    this.name = adı;
    this.type = növü;
  }
 
  getName () {
    return this.name;
  }
 
  getType () {
    this.type qayıt;
  }
 
}
sinif Avtomobil Vasitə genişləndirir {
 
  konstruktor (adı) {
    super (ad, 'maşın');
  }
}
const diablo = yeni avtomobil ('Lamborghini');
konsol.log (diablo.getName ());
konsol.log (diablo.getType ());

Qeyd: Yuxarıdakı misalda, Ruby Vehicle sinfi, adətən, dəyişənlər üçün qazanma metodlarını yaratmaq üçün bir atribut oxuyucusu ilə həyata keçiriləcəkdir. JavaScript tətbiqinə daha çox bənzəmək üçün bir atribut oxucu istifadə etməməyi seçdim.

Məhv etmək

Müasir JavaScript, dağıdıcı deyilən həqiqətən xoş bir şeyi təqdim etdi, burada dizilər və ya obyektlər içərisindəki elementləri qısa bir sintaksis ilə dəyişənlərə təyin edə bilərsiniz.

JavaScript:

firstName, lastName = 'James Bond'.split ();
console.log (`Mənim adım $ {lastName}, $ {firstName} $ {lastName}`);

Şübhəsiz bunu Rubydə edə bilməzsiniz!

Yaqut:

first_name, last_name = "James Bond" .split
qoyur "Mənim adım # {sonuncu_name}, # {ilk_name} # {son_name}"

Qeyd: Ruby-də JavaScript-də etdiyimiz kimi silsilə serialları məhv edə bilsək də, birbaşa dağıdıcı çubuqlara Ruby ekvivalenti yoxdur.

Yayıcı Operator

Müasir JavaScript, sıfır və ya daha çox arqumentin və ya elementin gözlənildiyi yerlərdə dəyişdirilə bilən ifadələrin genişlənməsinə imkan verən yayma operatorunu da təqdim etdi.

JavaScript:

funksiya cəmi (x, y, z) {
  x + y + z qayıt;
};
const ədədləri = [1, 2, 3];
konsol.log (cəmi (... ədəd);
[a, b, ... istirahət] = [10, 20, 30, 40, 50];
konsol.log (a);
konsol.log (b);
konsol.log (istirahət); // istirahət Array!

Ruby-də bunun üçün splat operatorumuz var.

Yaqut:

def cəmi (x, y, z)
  x + y + z
son
ədəd = [1, 2, 3]
cəmi qoyur (* ədəd)
a, * istirahət, b = [10, 20, 30, 40, 50]
qoyur a
qoyur b
istirahət qoyur # istirahət bir Array!

Qeyd: Yəqin ki, Ruby-də istirahətin digər dəyişənlər arasında olduğunu gördünüz. Bu splat operatoru dəyişənlər arasında hər hansı bir yerə yerləşdirilə bilər. JavaScript-də, yayılma operatoru son gəlməlidir.

Yaqut eyni şeyləri hashesdə etmək üçün ikiqat splat operatoru ** var. JavaScript ES2018 spesifikasiyası yayılmış operatoru obyektlərə də təqdim edir.

Son söz

Yəqin ki, başa düşdüyünüz kimi, hər iki dil bir-birindən o qədər də fərqlənmir və ES6 ilə JavaScript yazmaq getdikcə daha xoş hala gəldi. Əlbətdə ki, JavaScript brauzerin dilidir və onun fəaliyyət dairəsi asinxron davranışı təmin edir. Digər tərəfdən, Yaqutun metaproqramlama üçün çox güclü alətləri var və idiomatik sintaksisi ilə sevilir. Sonda sonunda, hər ikisini də öyrənməyin və bilməyin faydalı olduğunu düşünürəm, çünki tez-tez bir proqramlaşdırma dilini bilmək sizə başqa bir problemi necə həll etmək və ya necə həll etmək barədə fikir verəcəkdir.