Kóðauppsögn: Ruby vs Javascript

Ruby og JavaScript eru að fara að fara á hausinn. Bæði þessi skriftunarmál eru virk gerð og styðja hlutbundin forritun. Við munum kanna mismun þeirra eða líkt á milli algengari eiginleika þeirra.

Fyrirvari: Við erum aðeins að skoða nútímalegt JavaScript ES6 setningafræði hér.

Ljósmynd af Pramote Polyamate á 500px

Strengjasamskipti

Í tölvuforritun er interpolation strengja ferlið við að sprauta gildi breytu eða tjáningu í bókstaflegri streng.

Í Ruby er þetta kallað, þú giskaðir á það, strengjaaðlögun.

Ruby:

first_name = "Martin"
last_name = "Riggs"
setur „Hæ, ég er # {first_name} # {last_name}.“

Í Javascript er hægt að ná sama hlutum með sniðmátabókstöfum.

JavaScript:

const firstName = 'Martin';
const lastName = 'Riggs';
console.log (`Hæ, ég er $ {firstName} $ {lastName} .`);

Aðferðir og aðgerðir

Wikipedia skýrir frá því að í tölvuforritun er undirrútín röð leiðbeininga forritsins sem sinnir ákveðnu verkefni, pakkað sem eining. Síðan er hægt að nota þessa einingu í forritum hvar sem viðkomandi verkefni ætti að framkvæma.

Á mismunandi forritunarmálum getur undirverkefni verið kallað aðferð, aðgerð, venja, aðferð eða undirforrit.

Til þess að nota þurfi fyrst að skilgreina þessar undirroutínur og hringja síðan. Í Ruby eru þær þekktar sem aðferðir og í JavaScript eru þær kallaðar aðgerðir.

Ruby:

def full_name (first_name, last_name)
  "# {first_name.capitalize} # {last_name.capitalize}"
enda
setur fullt nafn („beatrix“, „kiddo“)

JavaScript:

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

Ef þú ert að keyra dæmin hér að ofan, hefur þú sennilega tekið eftir því að JavaScript dæmið virkar ekki en kastar villu: Unctained TypeError: firstName.capitalize er ekki fall!

Þetta er vegna þess að JavaScript skilgreinir ekki hástafinn eiginleikann. Ruby hefur margar handhægar og snyrtilegar, idiomatic aðferðir eins og #capitalize sem eru mjög þægilegar. Til að láta dæmið hér að ofan virka verðum við að nota frumgerðakeðjuna (apaplástur) á JavaScript String mótmæla:

String.prototype.capitalize = fall () {
  skila þessu.charAt (0) .toUpperCase () + this.slice (1);
}

Blokkir

Í Ruby eru blokkir í grundvallaratriðum ónefndir klumpur af kóða sem hægt er að fara á og kalla eftir aðferðum innan frá. Margar af innbyggðum hlutaraðferðum í Ruby samþykkja blokkir og þetta eru þægileg leið til að fínstilla hvernig slíkar aðferðir haga sér.

Ruby:

def teljara
  start_time = Time.now
  setur „Running block ...“
  
  uppskera
  setur "Lokið!"
  end_time = Time.now - start_time
  „Framkvæmdartími: # {end_time}“
enda
setur tímamælir {(0..10000000) .sort}

Hæ, JavaScript er ekki með blokkir, svo að framkvæmdin hér að ofan er ekki möguleg og samanburðurinn er kjánalegur! Eða er það? Aðgerðir JavaScript geta samþykkt svarhringingu sem rök og ef við teljum að Ruby blokkir séu mjög eins og nafnlausar aðferðir getum við náð svipuðum árangri.

JavaScript:

aðgerðartímastillir (svarhringing) {
  const startTime = new Date (). getTime ();
  console.log ("Keyra svarhringingu ...");
  
  svarhringingu ();
  console.log ("Lokið!");
  const endTime = nýr dagsetning (). getTime ();
  skila `Framkvæmdartími: $ {endTime - startTime}`;
};
teljara (() => Array.from (Array (10000000). lyklar ()). sort ());

Athugasemd: Ólíkt Ruby, JavaScript er ekki með innbyggðan Range mótmæla. Array.from (Number). Lyklar () hér að ofan skilar fylki frá 0 til Number.

Fíflalegar endurtekningar

Ruby er þekktur fyrir að hafa mjög fallega idiomatic endurtekninga til að fara í gegnum fylki (og önnur fjöldamörk eða endurtekningarvirki).

Ruby:

names = ["Tango", "Cash", "Dalton", "Riggs"]
names.each do | nafn |
  setur nafn
enda

Með ES6 verður endurtekning með fylki í JavaScript gola:

JavaScript:

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

Athugasemd: Javascript forEach aðgerðin hefur einnig aðgang að vísitölu frumefnisins. Í Ruby myndum við nota aðra endurtekningu fyrir það sem kallast each_with_index.

Námskeið og bekkjarfurð

Í hlutbundinni forritun eru flokkar kóða sniðmát til að búa til hluti, veita gildi fyrir ástand (eiginleikar hlutar eða eiginleikar) og útfæra hegðun (svo sem getters og setjara til að lesa og skrifa slíka eiginleika eða eiginleika).

Ruby:

farartæki
  def frumstilla (nafn, tegund)
    @name = nafn
    @type = tegund
  enda
  def nafn
    @ nafn
  enda
  def gerð
    @tegund
  enda
enda
bekk Bíll <Ökutæki
  def frumstilla (nafn)
   frábær (nafn, 'bíll')
  enda
enda
diablo = Car.new ("Lamborghini")
setur diablo.name
setur diablo.type

JavaScript:

farartæki {
 
  framkvæmdaaðili (nafn, gerð) {
    this.name = nafn;
    this.type = tegund;
  }
 
  getName () {
    skila þessu.nafni;
  }
 
  getType () {
    skila þessu. tegund;
  }
 
}
bekk Bíll framlengir ökutæki {
 
  framkvæmdaaðili (nafn) {
    frábær (nafn, 'bíll');
  }
}
const diablo = nýr bíll ('Lamborghini');
console.log (diablo.getName ());
console.log (diablo.getType ());

Athugasemd: Í ofangreindu dæmi væri Ruby Vehicle flokkurinn venjulega útfærður með eigindalesara til að búa til getter aðferðir fyrir tilviksbreyturnar. Ég valdi að nota ekki eigindalestur til að svipa meira til JavaScript útfærslunnar.

Eyðilegging

Nútíma JavaScript kynnti þennan virkilega töff hlut sem kallast eyðilegging, þar sem þú getur úthlutað þætti í fylki eða hlutum til breytna með hnitmiðuðu setningafræði.

JavaScript:

firstName, lastName = 'James Bond'.split ();
console.log (`Mitt nafn er $ {efternafn}, $ {fyrsta nafn} $ {eftirnafn}`);

Þú getur örugglega ekki gert þetta í Ruby!

Ruby:

first_name, last_name = "James Bond" .split
setur „Ég heiti # {eftir_nafn}, # {fyrsta_nafn} # {eftir_nafn}“

Athugið: Þó að við getum eyðilagt fylki í Ruby mjög mikið eins og við gerum í JavaScript, þá er enginn Ruby sem jafngildir beint eyðileggingu hassi.

Breiða rekstraraðila

Nútíma JavaScript hefur einnig kynnt dreifingaraðilann sem gerir kleift að stækka ítrekaðar tjáningar þar sem búist er við núll eða fleiri rökum eða þáttum.

JavaScript:

fall summa (x, y, z) {
  skila x + y + z;
};
const tölur = [1, 2, 3];
console.log (summa (... tölur);
[a, b, ... hvíld] = [10, 20, 30, 40, 50];
hugga.log (a);
hugga.log (b);
console.log (hvíld); // hvíld er fylking!

Í Ruby erum við með sprettufyrirtækið fyrir þetta.

Ruby:

def summa (x, y, z)
  x + y + z
enda
tölur = [1, 2, 3]
setur summan (* tölur)
a, * hvíld, b = [10, 20, 30, 40, 50]
setur a
setur b
setur hvíld # hvíld er fylking!

Athugið: Þú hefur sennilega tekið eftir því að í Ruby * er hvíld á milli hinna breytanna. Það er hægt að setja rekstraraðilann hvar sem er meðal breytanna. Í JavaScript verður dreifingaraðilinn að koma síðastur.

Ruby er einnig með tvöfaldan splat rekstraraðila ** til að gera það sama á flýti. JavaScript ES2018 forskriftin kynnir einnig dreifingaraðila á hlutum.

Lokaorð

Eins og þú hefur sennilega áttað þig á eru bæði tungumálin ekki eins ólík eftir allt saman og með ES6 hefur JavaScript orðið æ skemmtilegra að skrifa. Jú, JavaScript er tungumál vafrans og atburðarásin veitir ósamstillta hegðun. Aftur á móti er Ruby með mjög öflug tæki til að nota forritun og er elskuð fyrir hugmyndafræði sína. Að leiðarlokum held ég að það sé hagkvæmt að læra og þekkja bæði eins og oft þekking á einu forritunarmáli gefur þér hugmyndir um hvernig eigi að kóða eða takast á við ákveðið vandamál í öðru.