21 Trik-Trik Ruby

Sewaktu mengurus Ruby Inside pengurusnya sering melihat banyak sekali code Ruby. Kebanyakan sih sangat bagus, tetapi kadang-kadang kita lupa kalau sebetulnya ada jalan pintas beserta trik-trik Ruby yang bisa digunakan daripada reinvent the wheel (maksudnya: menemukan sesuatu yang sudah ada). Berikut adalah 21 trik-trik Ruby yang beraneka-ragam, mulai dari yang biasa digunakan sehari-hari oleh Ruby Developer berpengalaman maupun juga yang belum banyak ditemukan. Sebelum menulis posting ini sebenarnya Penulis RubyInside bahkan belum dapat ide buat trik yang nomor 2! Pokoknya apapun level Ruby Anda, semoga dengan penyegaran dan pencerahan posting ini di kemudian hari dapat bermanfaat buat Anda di kemudian hari bila menemukan kasus serupa.

1 – Cara Cepat Mengekstraksi hasil match regexp

Cara yang biasa digunakan untuk mengekstrak data dari teks pakai regexp adalah dengan menggunakan metode match. Nah sebetulnya ada shortcut yang bisa dipakai agar proses hidup lebih sejahtera.

email = "Fred Bloggs <fred@bloggs.com>"
email.match(/<(.*?)>/)[1]     # => “fred@bloggs.com”
email[/<(.*?)>/, 1]           # => “fred@bloggs.com”
email.match(/(x)/)[1]         # => NoMethodError [:(]
email[/(x)/, 1]               # => nil
email[/([bcd]).*?([fgh])/, 2] # => “g”

2 – Shortcut buat Array#join

Sudah mafhum bagi kebanyakan kita Rubyist bila menggunakan Array#* dengan angka, untuk memproses kali dari besarnya array banyak elemen, tetapi jarang diketahui kalau sebenarnya kita bisa menggunakan Array#* buat string ketimbang memakai Array#join!

%w{ariekeren lagi ngetes} * ", "          # => "ariekeren, lagi, ngetes"
h = { :name => "ArieKeren", :age => 27 }
h.map { |i| i * "=" } * "\n"              # => “age=27\nname=ArieKeren”

3 – Cara Cepat Memformat Angka Desimal

Memformat angka float ke bentuk yang biasa digunakan untuk harga bisa dicapai dengan sprintf atau bisa juga dengan cara alternatif, yaitu dengan formatting interpolation:

duit = 9.5
"%.2f" % duit # => “9.50″

4 – Cara Cepat Mengapit Teks

Teknik formatting interpolation dari nomor ketiga keluar lagi, kali ini adalah bagaimana menyisipkan suatu string ke string yang lain:

"[%s]" % "stringnya pindah doang" # => “[stringnya pindah doang]”

Anda juga bisa menggunakan elemen-elemen dari array untuk mengganti penempatan string tersebut:

x = %w{p ketemulagi p}
"<%s>%s</%s>" % x # => “<p>ketemulagi</p>"

5 – Menghapus direktori beserta seluruh isinya

Jangan sortir ulang dengan menggunakan shell. Ruby punya library file utilities yang nyaman dipakai untuk operasi file seperti menghapus direktori berikut seluruh isinya:

require 'fileutils'
FileUtils.rm_r 'somedir'

Hati-hati kalau Anda menggunakan cara ini!

6 – Menyatukan dan Memisahkan enumerable

Tanda bintang juga bisa digunakan untuk menyatukan dan memisahkan enumerable (berfungsi untuk array maupun hash) daripada menggunakan metode flatten. Kita akan langsung lihat dari contoh berikut bicara ini saja biar jelas:

Contah dengan Array:

a = %w{a b}
b = %w{c d}
[ a + b ]   # => [[”a”, “b”, “c”, “d”]]
[ *a + b ]  # => [”a”, “b”, “c”, “d”]

Contoh dengan Hash:

a = { :name => "ArieKeren", :age => 27 }
# => {:name=>"ArieKeren", :age=>27}

[a]
# => [{:name=>"ArieKeren", :age=>27}]

[*a]
# => [[:name, "ArieKeren"], [:age, 27]]

Contoh dengan tangkapan parameter paralel:

a = %w{a b c d e f g h}
# => ["a", "b", "c", "d", "e", "f", "g", "h"]

b = [0, 5, 6]
# => [0, 5, 6]

a.values_at(*b)
# => ["a", "f", "g"]

7 – Persingkat definisi variabel lokal

Daripada mendefinisikan variabel lokal dengan beragam konten awal (sering hanya berupa hash kosong ataupun array kosong), Anda sebenarnya bisa langsung mendefinisikan variabel lokal “sekaligus” ketika operasi sedang berlangsung:

(z ||= []) << 'coba'

8 – Penggunaan yang-bukan-string maupun yang-bukan-simbol sebagai hash key

Sangat jarang kita lihat seseorang menggunakan yang-bukan-string maupun yang-bukan-simbol sebagai hash key. Padahal itu semua bisa dilakukan, dan kadang-kadang berguna (dan, tidak, contoh berikut bukan contoh yang dahsyat):

does = is = { true => 'Yes', false => 'No' }
does[10 == 50]
# => “No”

is[10 > 5]
# => “Yes”

9 – Gunakan ‘and’ dan ‘or’ untuk mengelompokkan operasi satu baris

Trik ini adalah trik yang biasa dipakai oleh Ruby Developer dengan penuh percaya diri untuk memperpadat, mempersingkat, dan menghilangkan terlalu banyaknya baris-baris kode yang sebetulnya berisikan statement-statement yang pendek-pendek:

queue = []
%w{hello x world}.each do |word|
  queue << word and puts "Added to queue" unless word.length < 2
end
puts queue.inspect
# Output:
#   Added to queue
#   Added to queue
#   ["hello", "world"]

10 – Menentukan eksekusi kode

Trik berikut merupakan pattern yang biasa digunakan Ruby Developer berpengalaman. Kalau Anda menulis Ruby script yang dapat digunakan sebagai library maupun langsung dari command line, Anda bisa menggunakan trik ini untuk menentukan apakah Anda sedang menjalankan script langsung atau tidak:

if __FILE__ == $0
  # Do something.. run tests, call a method, etc. We're direct.
end

11 – Mempercepat assignment sekaligus (mass assignment)

Mass assignment merupakan trik yang Ruby Developer pelajari dari awal-awal ya, tetapi adalah sesuatu yang amazing dan menyenangkan betapa jarang trik ini digunakan:

a, b, c, d = 1, 2, 3, 4

Trik ini bisa dipakai di banyak kasus seperti menangkap parameter argumen suatu metode yang berupa array dengan tanda * (bintang) :

def my_method(*args)
  a, b, c, d = args
end

12 – Gunakan range daripada perbandingan rumit untuk angka

Tidak ada lagi kode omong kosong seperti if x > 1000 && x < 2000.

year = 1972
puts  case year
        when 1970..1979: "Tujuhpuluhan"
        when 1980..1989: "Delapanpuluhan"
        when 1990..1999: "Sembilanpuluhan"
      end

13 – Gunakan Enumeration untuk menghindari kode-kode berulang

%w{rubygems daemons eventmachine}.each { |x| require x }

14 – Operator Ternary

Trik lain yang biasa dipelajari di awal-awal oleh Ruby Developer tetapi sesuatu yang sebenarnya jarang kelihatan digunakan oleh Ruby Developer berpengalaman adalah operator ternary. Operator ternary bukan hammer, tetapi terkadang bisa membuat banyak hal menjadi singkat dan padat.

puts x == 10 ? "x adalah sepuluh" : "x bukan sepuluh"

# Atau.. bisa juga digunakan untuk assignment yang bersandar pada hasil operator ternary
LOG.sev_threshold = ENVIRONMENT == :development ? Logger::DEBUG : Logger::INFO

15 – Operator Ternary Bersarang (Nested Ternary Operators)

Trik ini bisa jadi membuat kode menjadi rumit dibaca. Tetapi sebenarnya hanya urusan return obyek saja sama seperti banyak obyek lain di Ruby.

qty = 1
qty == 0 ? 'none' : qty == 1 ? 'one' : 'many'
# Hanya sebagai ilustrasi saja supaya tidak bingung:
(qty == 0 ? 'none' : (qty == 1 ? 'one' : 'many'))

16 – Maksimalkan penggunaan fitur bawaan logis di Ruby

Ada sering banyak metode yang menggunakan pattern kurang lebih sebagai berikut:

def is_odd(x)
  # Terlalu panjang..
  if x % 2 == 0
    return false
  else
    return true
  end
end

Mungkin kita bisa saja menggunakan operator ternary untuk improve?

def is_odd(x)
  # Jangan sekali-sekali menaruh false dan true pada operator ternary!!
  x % 2 == 0 ? false : true
end

Ya, kode barusan tadi memang lebih pendek, dan saya sering melihat pattern seperti itu, padahal sebenarnya Anda seharusnya bisa selangkah lebih maju dan menyandarkan diri pada hasil respon dari operator comparison Ruby yang berupa true maupun false langsung!

def is_odd(x)
  # Gunakan hasil logis yang sudah disediakan Ruby secara otomstis untuk Anda..
  x % 2 != 0
end

17 – Perhatikan seluruh exception backtrace

def do_division_by_zero; 5 / 0; end
begin
  do_division_by_zero
rescue => exception
  puts exception.backtrace
end

18 – Manfaatkan obyek tunggal DAN array agar dapat dienumerasikan

[*items].each do |item|
  # …
end

19 – Rescue yang berada dalam blok tidak perlu diapit ‘begin’

def x
  begin
    # …
  rescue
    # …
  end
end
def x
  # …
rescue
  # …
end

20 – Komentar format blok

Di Ruby kita bisa dengan bebas sesuai selera untuk berkomentas di kode dengan pagar ataupun menggunakan blok begin dan end:

puts "x"
=begin
  ini adalah blok komentar
  Anda dapat menaruh apa saja yang Anda suka disini!

  puts "y"
=end
puts "z"

21 – Rescue satu baris

h = { :age => 10 }
h[:name].downcase                         # ERROR
h[:name].downcase rescue "No name"        # => “No name”

Jika Anda ingin mem-posting daftar trik-trik Ruby di blog Anda, kirimkan trackback kesini atau berkomentarlah lewat media milis ID Ruby maupun blog Anda, nanti kami akan melink semua posting. Alternatif lain, seperti yang sudah sering didengung-dengungkan di komunitas Ruby Indonesia, Anda dapat menghubungi kami bila Anda mempunyai artikel, tulisan tentang Ruby, maupun trik-trik Ruby untuk kami pasang disini, semua hal seperti komentar, maupun kritik dan hal-hal lain demi kebaikan dan kemajuan kita bersama. Terima kasih.

Sumber tulisan dari RubyInside – 21 Ruby Tricks You Should Be Using In Your Own Code dengan penyesuaian seperlunya oleh ArieKeren