Code Showdown: Ruby vs Javascript

Ruby dan JavaScript akan saling berhadapan. Kedua bahasa skrip ini diketik secara dinamis dan mendukung pemrograman berorientasi objek. Kami akan memeriksa perbedaan atau kesamaan mereka di beberapa fitur mereka yang lebih umum.

Penafian: Kami hanya melihat sintaksis JavaScript ES6 modern di sini.

Foto oleh Pramote Polyamate pada 500px

Interpolasi string

Dalam pemrograman komputer, interpolasi string adalah proses menyuntikkan nilai variabel atau ekspresi dalam string literal.

Di Ruby, ini disebut, Anda dapat menebaknya, interpolasi string.

Rubi:

first_name = "Martin"
last_name = "Riggs"
menempatkan "Hai, saya # {first_name} # {last_name}."

Dalam Javascript, hal yang sama dapat dicapai dengan templat literal.

JavaScript:

const firstName = 'Martin';
const lastName = 'Riggs';
console.log (`Hai, saya $ {firstName} $ {lastName} .`);

Metode dan fungsi

Wikipedia menjelaskan bahwa, dalam pemrograman komputer, subrutin adalah urutan instruksi program yang melakukan tugas tertentu, dikemas sebagai satu unit. Unit ini kemudian dapat digunakan dalam program di mana pun tugas itu harus dilakukan.

Dalam bahasa pemrograman yang berbeda, subrutin dapat disebut prosedur, fungsi, rutin, metode, atau subprogram.

Agar dapat digunakan, subrutin ini harus didefinisikan terlebih dahulu dan kemudian dipanggil. Di Ruby, mereka dikenal sebagai metode dan dalam JavaScript, mereka disebut fungsi.

Rubi:

def full_name (first_name, last_name)
  "# {first_name.capitalize} # {last_name.capitalize}"
akhir
menempatkan full_name ("beatrix", "kiddo")

JavaScript:

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

Jika Anda menjalankan contoh di atas, Anda mungkin memperhatikan bahwa contoh JavaScript tidak berfungsi, tetapi membuat kesalahan: Uncaught TypeError: firstName.capitalize bukan fungsi!

Ini karena JavaScript tidak mendefinisikan fungsi huruf besar secara asli. Ruby memiliki banyak metode idiomatis yang praktis dan rapi seperti #capitalize yang sangat nyaman. Agar contoh di atas berfungsi, kita perlu menggunakan rantai prototipe (tambalan monyet) pada objek JavaScript String:

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

Blok

Di Ruby, blok pada dasarnya adalah potongan kode yang tidak disebutkan namanya yang dapat diteruskan dan dipanggil dari metode di dalam. Banyak metode objek bawaan di Ruby menerima blok dan ini adalah cara mudah untuk mengubah cara metode tersebut berperilaku.

Rubi:

timer def
  start_time = Time.now
  menempatkan "Running block ..."
  
  menghasilkan
  menempatkan "Finished!"
  end_time = Time.now - start_time
  "Waktu eksekusi: # {end_time}"
akhir
menempatkan timer {(0..10000000) .sort}

Hai, JavaScript tidak memiliki blok, jadi implementasi di atas tidak mungkin dan perbandingannya konyol! Atau itu? Fungsi JavaScript dapat menerima fungsi panggilan balik sebagai argumen dan jika kami menganggap blok Ruby sangat mirip dengan metode anonim, kami dapat mencapai hasil yang serupa.

JavaScript:

timer fungsi (panggilan balik) {
  const startTime = Date baru (). getTime ();
  console.log ("Menjalankan panggilan balik ...");
  
  panggilan balik ();
  console.log ("Selesai!");
  const endTime = Date baru (). getTime ();
  return `Execution time: $ {endTime - startTime}`;
};
timer (() => Array.from (Array (10000000) .key ()). sort ());

Catatan: Tidak seperti Ruby, JavaScript tidak memiliki objek Rentang bawaan. Array.from (Number) .key () di atas mengembalikan Array dari 0 ke Number.

Iterasi idiomatik

Ruby dikenal memiliki iterator idiomatik yang sangat bagus untuk di-loop melalui Array (dan Enumerables lain atau struktur berulang).

Rubi:

names = ["Tango", "Cash", "Dalton", "Riggs"]
names.each do | name |
  menempatkan nama
akhir

Dengan ES6, iterasi melalui array dalam JavaScript menjadi mudah:

JavaScript:

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

Catatan: Fungsi Javascript forEach juga dapat mengakses indeks elemen. Di Ruby, kita akan menggunakan iterator yang berbeda untuk itu yang disebut each_with_index.

Kelas dan warisan kelas

Dalam Pemrograman Berorientasi Objek, kelas adalah templat kode untuk membuat objek, memberikan nilai untuk keadaan (properti atau atribut objek) dan perilaku penerapan (seperti getter dan setter untuk membaca dan menulis properti atau atribut tersebut).

Rubi:

Kendaraan kelas
  def inisialisasi (nama, tipe)
    @nama = nama
    @type = type
  akhir
  nama def
    @nama
  akhir
  jenis def
    @mengetik
  akhir
akhir
Mobil kelas 
diablo = Car.new ("Lamborghini")
menempatkan diablo.name
menempatkan diablo.type

JavaScript:

Kendaraan kelas {
 
  constructor (nama, jenis) {
    this.name = nama;
    this.type = type;
  }
 
  getName () {
    kembalikan this.name;
  }
 
  getType () {
    kembalikan this.type;
  }
 
}
Mobil kelas meluas Kendaraan {
 
  constructor (nama) {
    super (nama, 'mobil');
  }
}
const diablo = Mobil baru ('Lamborghini');
console.log (diablo.getName ());
console.log (diablo.getType ());

Catatan: Dalam contoh di atas, kelas Ruby Vehicle biasanya akan diimplementasikan dengan pembaca atribut untuk membuat metode pengambil untuk variabel instan. Saya memilih untuk tidak menggunakan pembaca atribut sehingga memiliki tampilan yang lebih mirip dengan implementasi JavaScript.

Destrukturisasi

JavaScript modern memperkenalkan hal yang sangat keren ini disebut destructure, di mana Anda dapat menetapkan elemen di dalam array atau objek ke variabel dengan sintaksis singkat.

JavaScript:

firstName, lastName = 'James Bond'.split ();
console.log (`Nama saya adalah $ {lastName}, $ {firstName} $ {lastName}`);

Tentunya Anda tidak dapat melakukan ini di Ruby!

Rubi:

first_name, last_name = "James Bond" .split
menempatkan "Nama saya adalah # {last_name}, # {first_name} # {last_name}"

Catatan: Meskipun kami dapat sangat merusak array di Ruby seperti yang kami lakukan pada JavaScript, tidak ada Ruby yang setara dengan hash yang langsung dirusak.

Operator Sebarkan

Modern JavaScript juga telah memperkenalkan operator penyebaran yang memungkinkan ekspresi iterable untuk diperluas di mana nol atau lebih argumen atau elemen diharapkan.

JavaScript:

jumlah fungsi (x, y, z) {
  kembalikan x + y + z;
};
angka const = [1, 2, 3];
console.log (jumlah (... angka);
[a, b, ... istirahat] = [10, 20, 30, 40, 50];
console.log (a);
console.log (b);
console.log (istirahat); // istirahat adalah Array!

Di Ruby, kami memiliki operator percikan untuk ini.

Rubi:

jumlah def (x, y, z)
  x + y + z
akhir
angka = [1, 2, 3]
menempatkan jumlah (* angka)
a, * istirahat, b = [10, 20, 30, 40, 50]
menempatkan a
menempatkan b
menempatkan sisa # sisanya adalah sebuah array!

Catatan: Anda mungkin memperhatikan bahwa di Ruby * sisanya berada di antara variabel-variabel lainnya. Itu operator percikan dapat ditempatkan di mana saja di antara variabel. Dalam JavaScript, operator spread harus menjadi yang terakhir.

Ruby juga memiliki operator percikan ganda ** untuk melakukan hal yang sama pada hash. Spesifikasi JavaScript ES2018 juga memperkenalkan operator spread pada objek.

Kata terakhir

Seperti yang mungkin Anda sadari, kedua bahasa tidak begitu berbeda dan, dengan ES6, JavaScript menjadi semakin menyenangkan untuk ditulis. Tentu saja, JavaScript adalah bahasa browser dan loop acara menyediakan perilaku tidak sinkron. Di sisi lain, Ruby memiliki alat yang sangat kuat untuk melakukan metaprogramming dan disukai karena sintaksis idiomatiknya. Pada akhir bagian, saya pikir bermanfaat untuk mempelajari dan mengetahui keduanya karena seringkali pengetahuan tentang satu bahasa pemrograman akan memberi Anda ide tentang cara membuat kode atau mengatasi masalah tertentu di bahasa lain.