Kodo rodymas: „Ruby vs Javascript“

„Ruby“ ir „JavaScript“ eis link galvos. Abi šios scenarijų kalbos yra dinamiškai įvestos ir palaiko į objektus orientuotą programavimą. Išnagrinėsime jų skirtumus ar panašumus tarp kai kurių jų įprastesnių bruožų.

Atsakomybės atsisakymas: čia žiūrime tik į šiuolaikinę „JavaScript ES6“ sintaksę.

„Pramote Polyamate“ nuotrauka, 500 piks

Styginių interpoliacija

Kompiuteriniame programavime styginių interpoliacija yra kintamojo arba išraiškos vertės įvedimo eilutės žodyne procesas.

Rubine tai vadinama, jūs atspėjote, styginių interpoliacija.

Rubinas:

first_name = "Martin"
last_name = "Riggs"
iškelia „Labas, aš # {first_name} # {last_name}“.

„Javascript“ tą patį galima pasiekti naudojant šabloninius rašmenis.

„JavaScript“:

const firstName = 'Martinas';
const lastName = 'Riggs';
console.log („Sveiki, aš $ {firstName} $ {lastName}.“);

Metodai ir funkcijos

Vikipedija paaiškina, kad kompiuteriniame programavime paprogramė yra programos instrukcijų seka, vykdanti konkrečią užduotį, supakuota kaip vienetas. Tada šis mazgas gali būti naudojamas programose, kur tik reikia atlikti tą užduotį.

Įvairiomis programavimo kalbomis paprogramė gali būti vadinama procedūra, funkcija, rutina, metodu arba paprograme.

Norint naudoti šias paprogrames, pirmiausia reikia jas apibrėžti, o tada iškviesti. „Ruby“ jie yra žinomi kaip metodai, o „JavaScript“ - jie vadinami funkcijomis.

Rubinas:

def full_name (vardas_pavardė, pavardė)
  "# {first_name.capitalize} # {last_name.capitalize}"
pabaiga
įveda pilną vardą („beatrix“, „kiddo“)

„JavaScript“:

funkcija fullName (vardas, pavardė) {
  grąžinti `$ {firstName.capitalize ()} $ {lastName.capitalize ()}`;
};
console.log („fullName“ („beatrix“, „kiddo“));

Jei vykdote aukščiau pateiktus pavyzdžius, tikriausiai pastebėjote, kad „JavaScript“ pavyzdys neveikia, tačiau pateikia klaidą: Neužfiksuota „TypeError“: „FirstName.capitalize“ nėra funkcija!

Taip yra todėl, kad „Java“ neapibrėžia didžiųjų raidžių rašymo funkcijos. „Ruby“ turi daugybę patogių ir tvarkingų idiomatinių metodų, tokių kaip #kapitalizacija, kurie yra tikrai patogūs. Norėdami, kad aukščiau pateiktas pavyzdys veiktų, „JavaScript“ eilutės objekte turėsime naudoti grandinės prototipą (beždžionių pataisą):

String.prototype.capitalize = function () {
  grąžinti this.charAt (0) .toUpperCase () + this.slice (1);
}

Blokai

„Ruby“ blokai iš esmės yra bevardžiai kodo fragmentai, kuriuos galima perduoti ir iškviesti iš vidaus metodais. Daugybė įmontuotų „Ruby“ objektų metodų priima blokus ir tai yra patogus būdas patikslinti, kaip tokie metodai elgiasi.

Rubinas:

def laikmatis
  pradžios laikas = laikas
  pateikia „Bėgantis blokas ...“
  
  derlius
  iškelia „Baigta!“
  pabaigos laikas = laikas.žino - pradžios laikas
  „Vykdymo laikas: # {end_time}“
pabaiga
pateikia laikmatį {(0..10000000) .sort}

Ei, „JavaScript“ neturi blokų, todėl aukščiau pateiktas diegimas neįmanomas ir palyginimas kvailas! Ar tai yra? „JavaScript“ funkcijos gali priimti atšaukimo funkcijas kaip argumentus ir, jei manome, kad „Ruby“ blokai yra labai panašūs į anoniminius metodus, galime pasiekti panašų rezultatą.

„JavaScript“:

funkcijos laikmatis (atgalinis ryšys) {
  „const startTime“ = nauja data (). „getTime“ ();
  console.log („Vykdomas atšaukimas ...“);
  
  perskambink();
  console.log („Baigta!“);
  const endTime = nauja data (). getTime ();
  return `Vykdymo laikas: $ {endTime - startTime}`;
};
laikmatis (() => masyvas.iš (masyvas (10000000). raktai ()). rūšiuoti ());

Pastaba: skirtingai nei „Ruby“, „JavaScript“ neturi įmontuoto diapazono objekto. Aukščiau pateiktas Array.from (Number) .keys () grąžina masyvą nuo 0 iki Number.

Idiomatinės iteracijos

„Ruby“ yra žinomas dėl to, kad turi labai gražius idiomatinius iteratorius, norinčius pereiti per masyvus (ir kitus Enumerables ar iteracinius darinius).

Rubinas:

vardai = [„Tango“, „Cash“, „Dalton“, „Riggs“]
vardai.ir visi padaryti | vardai |
  kelia vardą
pabaiga

Naudojant ES6, iteravimas per „JavaScript“ masyvą tampa vėjas:

„JavaScript“:

const pavadinimai = ['Tango', 'Cash', 'Dalton', 'Riggs'];
names.forEach (name => console.log (vardas));

Pastaba: „Javascript forEach“ funkcija taip pat gali pasiekti elemento rodyklę. „Ruby“ programoje būtų naudojamas kitoks iteratorius, kuris vadinasi „katra_su_indeksu“.

Klasės ir klasės palikimas

Į objektą orientuotame programavime klasės yra kodo šablonai, skirti sukurti objektus, pateikti būsenos reikšmes (objekto savybes ar atributus) ir įgyvendinti elgesį (pvz., Getteriai ir setteriai, norintys skaityti ir rašyti tokias savybes ar atributus).

Rubinas:

klasės transporto priemonė
  def inicializuoti (vardas, tipas)
    @vardas = vardas
    @ tipas = tipas
  pabaiga
  def vardas
    @vardas
  pabaiga
  def tipas
    @ tipas
  pabaiga
pabaiga
klasės automobilis 
diablo = „Car.new“ („Lamborghini“)
kelia diablo.vardas
kelia diablo.type

„JavaScript“:

klasės transporto priemonė {
 
  konstruktorius (vardas, tipas) {
    this.name = vardas;
    this.type = tipas;
  }
 
  getName () {
    grąžinti šį vardą;
  }
 
  getType () {
    grąžinti šį tipą;
  }
 
}
klasės automobilis praplečia transporto priemonę {
 
  konstruktorius (vardas) {
    super (vardas, 'automobilis');
  }
}
const diablo = naujas automobilis ('Lamborghini');
console.log (diablo.getName ());
console.log (diablo.getType ());

Pastaba: aukščiau pateiktame pavyzdyje „Ruby Vehicle“ klasė paprastai būtų įgyvendinama su atributų skaitytuvu, kad būtų sukurti egzempliorių kintamųjų „getter“ metodai. Aš nusprendžiau nenaudoti atributų skaitytuvo, kad būtų panašesnis į „Java“ diegimo variantą.

Pertvarkymas

Šiuolaikinis „JavaScript“ pristatė šį tikrai šaunų dalyką, vadinamą destruktavimu, kuriame galima priskirti elementus masyvų viduje ar objektams kintamuosius su glausta sintaksė.

„JavaScript“:

vardas, pavardė = 'James Bond'.split ();
console.log („Mano vardas yra $ {lastName}, $ {firstName} $ {lastName}“);

Tikrai negalima to padaryti „Ruby“!

Rubinas:

Vardas, Pavardė = "Džeimsas Bondas" .skaidyti
iškelia „Mano vardas yra # {last_name}, # {first_name} # {last_name}“

Pastaba: nors „Ruby“ masyvus galime sunaikinti labai panašiai, kaip tai darome „JavaScript“, nėra jokio Ruby atitikmens tiesiogiai destrukcijos maišos.

Skleisti operatorių

Šiuolaikinis „JavaScript“ taip pat pristatė paskirstymo operatorių, kuris leidžia išplėsti kartojamas išraiškas ten, kur tikimasi nulio ar daugiau argumentų ar elementų.

„JavaScript“:

funkcijos suma (x, y, z) {
  grįžti x + y + z;
};
const skaičiai = [1, 2, 3];
console.log (suma (... skaičiai);
[a, b, ... poilsis] = [10, 20, 30, 40, 50];
console.log (a);
console.log (b);
console.log (poilsis); // poilsis yra masyvas!

„Ruby“ turime tam skirtą operatorių.

Rubinas:

def suma (x, y, z)
  x + y + z
pabaiga
skaičiai = [1, 2, 3]
kelia sumą (* skaičius)
a, * poilsis, b = [10, 20, 30, 40, 50]
kelia a
kelia b
kelia poilsį # poilsis yra masyvas!

Pastaba: tikriausiai pastebėjote, kad „Ruby“ * poilsis yra tarp kitų kintamųjų. Tai reiškia, kad dėžės operatorių galima dėti bet kurioje kitoje vietoje. „JavaScript“ sklaidos operatorius turi būti paskutinis.

„Ruby“ taip pat turi dvigubą špagato operatorių **, kad tą patį padarytų maišais. „JavaScript ES2018“ specifikacija taip pat supažindina su paskirstymo operatoriumi objektuose.

Galutinis žodis

Kaip jau tikriausiai supratote, abi kalbos nėra tiek skirtingos, o turint ES6, „JavaScript“ rašyti tapo vis maloniau. Žinoma, „JavaScript“ yra naršyklės kalba, o jos įvykių ciklas užtikrina asinchroninį elgesį. Kita vertus, „Ruby“ turi labai galingus metaprogramavimo įrankius ir yra mylimas dėl savo idiomatinės sintaksės. Pabaigoje, mano manymu, naudinga mokytis ir žinoti tiek viena, tiek kitos programavimo kalbos žinios, kurios suteiks idėjų, kaip užkoduoti ar išspręsti tam tikrą problemą kitoje.