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

Baca Selengkapnya…

Rubinius On Rails: Rubinius Telah Menjadi Implementasi Ruby Ketiga yang Menjalankan Rails

Evan Phoenix telah mengumumkan bahwa proyek Rubinius telah mencapai major milestone: Rubinius bisa menjalankan Rails! Ini berarti telah membuat Rubinius menjadi yang ketiga yang telah mengimplementasikan penggabungan rails (setelah MRI dan JRuby) dan tentu akan mengangkat reputasi Rubinius menjadi lebih baik, ini telah menjadi implementasi kunci untuk diperhatikan di masa yang akan datang. Chad Fowler bahkan memberitakan bahwa dalam waktu satu tahun kedepan, Rubinius akan digunakan dalam production deployment dan akan segera menjadi implementasi standar Ruby secara de facto.

Sekarang kita melihat pada implementasi yang ada pada Microsoft, IronRuby, IronRuby juga boleh jadi akan segera bergabung dengan klub Rails segera.

Sumber: Rubinius On Rails: Rubinius Becomes 3rd Ruby Implementation to Run Rails

Baca Selengkapnya…

Merbunity: Komunitas Merb Terus Berkembang Meningkat

Merbunity adalah sebuah situs baru yang berisi tentang “berita, projek dan tutorial” berhubungan dengan framework Web Merb (alternatif umum untuk meningkatkan Rails). Ini merupakan langkah awal, tetapi memiliki desain yang bagus, dan memiliki content yang bagus. Merbunity ini dirasakan sedikit tampak seperti Ruby Inside untuk Merb. Kerja bagus! Antara peluncuran isi dan seketika menarik perhatian developer Merb Mac-based, yaitu Dr. Nic Williams’ TextMate bundle for Merb.

Sebenarnya tidak terlalu susah untuk menarik minat penggemar Merb. Pada beberapa bulan lalu banyaknya content luar biasa untuk developer Merb mengalami pertumbuhan yang signifikan. Contoh kunci meliputi Merb wiki, Merb book, tutorial “How to create a chat wall”, dan juga yang dimiliki Ruby Inside list of 21 Merb links, tutorials, dan sumber lain.

Baca Selengkapnya…

Membuat Rack di atas JRuby

Sebagian besar Developer Ruby tentunya telah familiar dengan Rack, sebuah interface / library abstrak yang memiliki banyak cara-cara yang mudah dari memasang kode hingga ke HTTP servers. Ini telah siap digunakan oleh beberapa framework aplikasi web Ruby, beberapa sebagai default – seperti Merb, dan sebuah tambahan lainnya seperti Rails. Rack dianggap signifikan karena melengkapi sebuah standart untuk aplikasi Web-facing Ruby dan frameworks yang menempel dan menjadi standard de-facto dalam space ini.

Nick Sieger mengembangkan JRuby-Rack, sejenis Rack yang bekerja pada Java-based implementasi Ruby, JRuby. Anda dapat menggunakan nya untuk banyak aplikasi Rack-compatible (aplikasi Rails dan Merb) disamping server aplikasi Java. Ini signifikan karena memberi kebebasan aplikasi kepada para developer. Cara abstrak untuk meratakan Ruby-based aplikasi web pada Java server dan kemudahan signifikan (setidaknya, lebih mudah dari sebelumnya!). Jika JRuby begitu bagus dan menarik bagi Anda, Anda sebaiknya juga menyimak JRuby Inside. Satu dari bagian Ruby Inside’s, dan untuk menampilkan secara keseluruhan link dan berita JRuby.

Sumber: Ruby Inside:Rack Makes It Onto JRuby

Baca Selengkapnya…

Inshoshi: Open-Source Rails, Social Networking Platform

Insoshi adalah sesuatu yang baru, open-source social networking platform yang dikembangkan dalam Ruby on Rails. Insoshi ini terdapat pada Github, sehingga Anda dapat mengembangkan aplikasi social Web yang Anda miliki. Feature yang ada didalamnya activity feeds, profiles, photo sharing, comment walls, blogs, forums, user messaging, dan admin panel.

Insoshi dikembangkan oleh Michael Hartl, penulis dari RailsSpace buku yang diterbitkan oleh Addison-Wesley tentang perkembangan sebuah social networking site dalam Rails. Hal ini penting untuk dicatat, bagaimanapun juga, Insoshi ini mendapat ijin dari Affero General Public License, sehingga source code yang tersedia berguna untuk membentuk site yang Anda miliki.

Lovd By Less merupakan sistem sebelumnya yang sama disebutkan disini pada Ruby Inside yang juga open source dan bebas untuk digunakan. Sistem ini sangat menyerupai pada bagian dalam feature nya (profiles, messaging, blogs, admin system, dll). Tetapi Lovd By Less membuat Anda mudah menggunakan nya dalam aplikasi komersial yang Anda miliki.

Sumber:Ruby Inside:Insoshi: Open-Source Rails-based Social Networking Platform

Baca Selengkapnya…

Mengubah Ruby 1.9 Bytecode ke Python

Tidak pernah ada satupun yang membiarkan kecerdikannya direndahkan di awal. Karena itulah The Lucky Stiff (penulis dari Poignant Guide dan pembuat Shoes) sedang sibuk mengerjakan sebuah sistem yang dapat mengubah Ruby 1.9 bytecode ke Python bytecode dari sana menjadi regular Python yaitu menggunakan cara melalui fasilitas dekompilasi yang dimiliki Phyton). Hal ini persisnya merupakan kumpulan dari sesuatu yang dipandang lebih, dan oleh karena itulah dibuat berlaku pada github. Tekhnik ini tampaknya bukan untuk menyatukan Python dan Ruby dalam hal apapun dan dalam arti penuh (langsung dari shared interpreter), tetapi penelitian dan percobaan serta usahanya yang rumit patut dihargai.

Sumber: Ruby Inside:Converting Ruby 1.9 Bytecode to Python

Baca Selengkapnya…

Promise dan Peril Untuk Implementasi Alternatif Ruby

Promise dan Peril untuk implementasi alternatif Ruby terlalu panjang, tetapi sangat menarik yang dibuat oleh Charles Nutter dari tim JRuby. Dia melihat pada Ruby 1.8, Ruby 1.9, JRuby, Rubinius, IronRuby, MacRuby dan beberapa implementasi minor, dan penjelasan mengenai latar belakang mereka serta situasi perkembangan yang mereka miliki saat ini, dan bagaimana proses yang mungkin akan dikerjakan untuk kedepan nya. Bagi yang tertarik dengan banyak implementasi dari Ruby hal ini harus dibaca.

Bagi siapa saja yang menginginkan versi pendek tanpa banyak konteks dan dapat cepat memahami Charles mempersembahkan: Pendahuluan Ruby 1.8.7 memiliki sebuah spanner dalam bekerja, Ruby 1.9 belum dapat menjalankan Rails (namun akan secepatnya), Ruby 1.9 tidak dapat menunjukkan kelebihan yang dimiliki kepada para Developer, JRuby rocks, Rubinius menarik namun peningkatan performance akan sangat sulit. Rubinius tampaknya akan mundur untuk penggunaan fungsi primitive C yang lebih dan pindah dari “Ruby dalam Ruby”, IronRuby sangat cerdas dan mungkin terjadi trouble running Rails. MacRuby merupakan ide yang bagus dari sekian banyak implementasi minor.

Sumber:Ruby Inside:The Promise and Peril for Alternative Ruby Implementations

Baca Selengkapnya…

<< Kembali ke Arsip Tahun 2008