Showdown: Ruby vs Javascript

Ruby in JavaScript bosta šla na glavo. Oba teh skriptnih jezikov sta dinamično tipkana in podpirata objektno usmerjeno programiranje. Preučili bomo njihove razlike ali podobnosti v nekaterih njihovih pogostejših lastnostih.

Izjava o omejitvi odgovornosti: Tu si ogledamo samo sodobno sintakso Java ES6.

Fotografijo Pramote Polyamate v 500px

Interpolacija niza

V računalniškem programiranju je interpolacija nizov postopek vbrizgavanja vrednosti spremenljivke ali izraza v dobesedni niz.

V Rubyju se temu reče, uganili ste, nizka interpolacija.

Ruby:

first_name = "Martin"
last_name = "Riggs"
postavi "Živjo, jaz sem {{prvo ime} # {last_name}."

V Javascriptu je mogoče isto doseči s predlogi literarne predloge.

JavaScript:

const firstName = 'Martin';
const lastName = 'Riggs';
console.log ("Živjo, jaz sem $ {firstName} $ {lastName}.");

Metode in funkcije

Wikipedia pojasnjuje, da je v računalniškem programiranju podprogram zaporedje programskih navodil, ki izvaja določeno nalogo, pakirano kot enota. Ta enota se nato lahko uporablja v programih, kjer koli mora biti opravljena določena naloga.

V različnih programskih jezikih lahko podprogram imenujemo postopek, funkcija, rutina, metoda ali podprogram.

Te podprograme je treba najprej uporabiti in jih nato poklicati. V Rubyju jih poznamo kot metode, v JavaScriptu pa jih imenujemo funkcije.

Ruby:

def polno ime (ime, priimek)
  "# {first_name.capitalize} # {last_name.capitalize}"
konec
postavlja polno ime ("beatrix", "kiddo")

JavaScript:

funkcija fullName (firstName, lastName) {
  return `$ {firstName.capitalize ()} $ {lastName.capitalize ()}`;
};
console.log (fullName ("beatrix", "kiddo"));

Če prikazujete zgornje primere, ste verjetno opazili, da primer JavaScript ne deluje, ampak sproži napako: Uncaught TypeError: firstName.capitalize ni funkcija!

To je zato, ker JavaScript ne definira funkcije začetnice z veliko začetnico. Ruby ima veliko priročnih in čednih idiomatičnih metod, kot je #capitalize, ki so res priročne. Da bi zgornji primer deloval, bomo morali v objektu JavaScript String uporabiti prototipno verigo (opičji obliž):

String.prototype.capitalize = function () {
  vrni to.charAt (0) .toUpperCase () + this.slice (1);
}

Bloki

V Rubyju so bloki v bistvu neimenovani kosi kode, ki jih je mogoče prenašati na in poklicati od znotraj. Številne vgrajene objektne metode v Rubyju sprejemajo bloke in to je priročen način za prilagoditev načina obnašanja takšnih metod.

Ruby:

def timer
  start_time = Time.now
  postavi "Teče blok ..."
  
  donos
  postavi "Končano!"
  end_time = Time.now - start_time
  "Čas izvajanja: # {end_time}"
konec
nastavi timer {(0..10000000) .sort}

Hej, JavaScript nima blokov, zato zgornja izvedba ni mogoča in primerjava je neumna! Ali pač? Funkcije JavaScript lahko sprejmejo povratne funkcije klicev kot argumente in če menimo, da so Ruby bloki podobni anonimnim metodam, lahko dosežemo podoben rezultat.

JavaScript:

časovnik funkcije (povratni klic) {
  const startTime = nov datum (). getTime ();
  console.log ("Zagon povratnega klica ...");
  
  poklicati nazaj();
  console.log ("Končano!");
  const endTime = nov datum (). getTime ();
  return `Čas izvajanja: $ {endTime - startTime}`;
};
timer (() => Array.from (Array (10000000) .keys ()). sort ());

Opomba: Za razliko od Rubyja JavaScript nima vgrajenega predmeta Range. Zgoraj Array.from (Number) .keys () vrne matriko od 0 do Number.

Idiomatične iteracije

Ruby je znana po tem, da ima zelo lepe idiomatske iteratorje, da se podaja skozi Arrays (in druge številske ali iterativne strukture).

Ruby:

name = ["Tango", "Cash", "Dalton", "Riggs"]
imena.each do | ime |
  postavlja ime
konec

Z ES6 postane iteriranje v matriki v JavaScript lahek:

JavaScript:

const imena = ['Tango', 'Cash', 'Dalton', 'Riggs'];
names.forEach (ime => console.log (ime));

Opomba: Funkcija Javascript forEach lahko dostopa tudi do indeksa elementa. V Rubyju bi uporabili drugačen iterator za tistega, ki se imenuje every_with_index.

Razredi in dedovanje razredov

V objektno orientiranem programiranju so razredi predloge kod za ustvarjanje predmetov, ki zagotavljajo vrednosti stanja (lastnosti ali lastnosti objekta) in vedenja izvajanja (kot so getters in setters za branje in zapisovanje takšnih lastnosti ali atributov).

Ruby:

razred Vozilo
  def inicializirati (ime, vrsta)
    @name = ime
    @ type = vrsta
  konec
  ime def
    @ime
  konec
  tip def
    @tip
  konec
konec
avtomobil razreda 
diablo = Car.new ("Lamborghini")
postavlja diablo.name
postavlja diablo.type

JavaScript:

Vozilo razreda {
 
  konstruktor (ime, vrsta) {
    this.name = ime;
    this.type = vrsta;
  }
 
  getName () {
    vrni to ime;
  }
 
  getType () {
    vrni ta.tip;
  }
 
}
razred avtomobila podaljša Vozilo {
 
  konstruktor (ime) {
    super (ime, 'avto');
  }
}
const diablo = nov avto („Lamborghini“);
console.log (diablo.getName ());
console.log (diablo.getType ());

Opomba: V zgornjem primeru bi bil razred Ruby Vehicle običajno izveden z bralnikom atributov, da bi ustvarili metode getter za spremenljivke primerka. Odločil sem se, da ne uporabljam bralnika atributov, da bi imel bolj podoben videz implementacije JavaScript.

Uničevanje

Sodobni JavaScript je predstavil to res kul zadevo, imenovano destrukturiranje, kjer lahko elementom znotraj nizov ali predmetov dodelite spremenljivke s jedrnato skladnjo.

JavaScript:

firstName, lastName = 'James Bond'.split ();
console.log (`Ime mi je $ {lastName}, $ {firstName} $ {lastName}`);

Zagotovo tega ne morete storiti v Rubyju!

Ruby:

prvo ime, priimek = "James Bond" .split
postavi "Moje ime je # {last_name}, # {first_name} # {last_name}"

Opomba: Čeprav lahko v Rubyju uničimo matrike tako zelo kot v JavaScriptu, Ruby ni enakovrednih ostrih neposredno uničevanja.

Spread Operator

Sodobni JavaScript je uvedel tudi operater širjenja, ki omogoča razširitev izraznih izrazov tam, kjer se pričakuje nič ali več argumentov ali elementov.

JavaScript:

vsota funkcije (x, y, z) {
  vrne x + y + z;
};
const števila = [1, 2, 3];
console.log (vsota (... številke);
[a, b, ... počitek] = [10, 20, 30, 40, 50];
console.log (a);
console.log (b);
console.log (počitek); // počitek je Array!

V Rubyju imamo za to operaterja splat.

Ruby:

def vsota (x, y, z)
  x + y + z
konec
številke = [1, 2, 3]
sešteva (* številke)
a, * počitek, b = [10, 20, 30, 40, 50]
postavlja a
postavlja b
počiva # počitek je Array!

Opomba: Verjetno ste opazili, da je v Ruby * počitek med drugimi spremenljivkami. To je operater splat lahko umeščen kamor koli med spremenljivke. V JavaScript-u mora biti operater širjenja zadnji.

Ruby ima tudi operaterja z dvojnim splatkom **, da na heheh stori isto. Specifikacija JavaScript ES2018 uvaja tudi operater širjenja na objekte.

Končna beseda

Kot ste verjetno ugotovili, oba jezika navsezadnje nista tako različna in z ES6 je JavaScript vedno bolj prijetno pisati. Seveda je JavaScript brskalnik, njegova zanka dogodkov pa zagotavlja asinhrono vedenje. Po drugi strani ima Ruby zelo močna orodja za metaprogramiranje in je ljubljena zaradi svoje idiomatične skladnje. Konec koncev mislim, da je koristno, če se naučite in poznate oboje, saj vam bo znanje enega programskega jezika pogosto dajalo ideje, kako kodirati ali se lotiti določene težave v drugi.