# Ini adalah sebuah komentar=begin
Ini adalah komentar multibaris
Tak seorang pun menggunakannya
Kamu juga tidak perlu
=end# Pertama-tama dan yang terpenting: Semuanya adalah objek.# Angka adalah objek3.class#=> Fixnum3.to_s#=> "3"# Beberapa aritmetika dasar1+1#=> 28-1#=> 710*2#=> 2035/5#=> 72**5#=> 325%3#=> 2# Operator-operator bitwise3&5#=> 13|5#=> 73^5#=> 6# Aritmetika tidak lain adalah pemanis sintaks (syntactic sugar)# untuk memanggil sebuah metode pada suatu objek1.+(3)#=> 410.*5#=> 50# Nilai-nilai khusus adalah objeknil# setara dengan "null" di bahasa-bahasa laintrue# kebenaranfalse# ketidakbenarannil.class#=> NilClasstrue.class#=> TrueClassfalse.class#=> FalseClass# Kesamaan1==1#=> true2==1#=> false# Ketidaksamaan1!=1#=> false2!=1#=> true# selain false itu sendiri, nil adalah nilai lain yang "salah"!nil#=> true!false#=> true!0#=> false# Perbandingan lain1<10#=> true1>10#=> false2<=2#=> true2>=2#=> true# Operator pembanding yang dikombinasikan ("spaceship operator")1<=>10#=> -110<=>1#=> 11<=>1#=> 0# Operator-operator logikatrue&&false#=> falsetrue||false#=> true!true#=> false# Terdapat versi-versi operator logika yang berbeda dengan lebih sedikit awalan.# Mereka digunakan sebagai kendali alur untuk merangkai beberapa pernyataan# hingga salah satunya mengembalikan (return) nilai true atau false.# `lakukan_suatu_lainnya` hanya dipanggil jika `lakukan_sesuatu` berhasil.lakukan_sesuatu()andlakukan_suatu_lainnya()# `catat_error` hanya dipanggil jika `lakukan_sesuatu` gagal.lakukan_sesuatu()orcatat_error()# String adalah objek'Aku adalah string'.class#=> String"Aku juga adalah string".class#=> Stringwadah='menggunakan string interpolation'"Aku bisa #{wadah} ketika memakai tanda kutip ganda"#=> "Aku bisa menggunakan string interpolation ketika memakai tanda kutip ganda"# Gunakan tanda kutip tunggal daripada tanda kutip ganda jika memungkinkan# String bertanda kutip ganda melakukan kalkulasi tambahan di dalam# Kombinasikan string, tapi tidak dengan angka'halo '+'dunia'#=> "halo dunia"'halo '+3#=> TypeError: can't convert Fixnum into String'halo '+3.to_s#=> "halo 3"# Kombinasikan string dengan operator'halo '*3#=> "halo halo halo "# Membubuhkan ke string'halo'<<' dunia'#=> "halo dunia"# cetak ke output dan buat baris baru (newline) di akhirputs"Aku mencetak!"#=> Aku mencetak!#=> nil# cetak ke output tanpa baris baruprint"Aku mencetak!"#=> Aku mencetak! => nil# Variabelx=25#=> 25x#=> 25# Catat bahwa pemberian nilai mengembalikan nilai yang diberikan# Artinya kamu bisa melakukan pemberian nilai secara jamak:x=y=10#=> 10x#=> 10y#=> 10# Berdasarkan adat, gunakan gaya snake_case untuk menulis nama variabelsnake_case=true# Gunakan nama variabel yang deskriptifpath_to_project_root='/good/name/'path='/bad/name/'# Simbol (adalah objek)# Simbol adalah konstanta yang dapat didaur ulang yang tidak dapat diubah# (immutable), secara internal diwakili oleh nilai integer. Seringkali # digunakan sebagai pengganti string untuk menyampaikan nilai yang mengandung# makna spesifik secara efisien.:menunggu.class#=> Symbolstatus=:menunggustatus==:menunggu#=> truestatus=='menunggu'#=> falsestatus==:diterima#=> false# Array# Ini adalah sebuah arrayarray=[1,2,3,4,5]#=> [1, 2, 3, 4, 5]# Array bisa menampung item dengan beragam tipe[1,'halo',false]#=> [1, "halo", false]# Array bisa di-indeks-kan# Dari depanarray[0]#=> 1array.first#=> 1array[12]#=> nil# Sama dengan aritmetika, pengaksesan [var]# hanyalah pemanis sintaks# untuk memanggil metode [] pada suatu objekarray.[]0#=> 1array.[]12#=> nil# Dari belakangarray[-1]#=> 5array.last#=> 5# Dengan indeks awal dan panjang (jumlah item)array[2,3]#=> [3, 4, 5]# Membalik sebuah Arraya=[1,2,3]a.reverse!#=> [3,2,1]# Atau menggunakan jangkauan (range)array[1..3]#=> [2, 3, 4]# Tambahkan ke array seperti iniarray<<6#=> [1, 2, 3, 4, 5, 6]# Atau seperti iniarray.push(6)#=> [1, 2, 3, 4, 5, 6]# Periksa apakah suatu item ada dalam sebuah arrayarray.include?(1)#=> true# Hash adalah kamus utama Ruby berupa pasangan kunci/nilai (key/value pair).# Hash ditandai dengan kurung kurawal:hash={'warna'=>'hijau','angka'=>5}hash.keys#=> ['warna', 'angka']# Nilai dalam Hash bisa diperoleh menggunakan kunci:hash['warna']#=> 'hijau'hash['angka']#=> 5# Meminta hash untuk kunci yang tidak ada akan mengembalikan nil:hash['tidak ada di sini']#=> nil# Sejak Ruby 1.9, ada sintaks khusus ketika menggunakan simbol sebagai kunci:hash_baru={defcon:3,action:true}hash_baru.keys#=> [:defcon, :action]# Periksa ada/atau tidaknya kunci dan nilai dalam hashhash_baru.key?(:defcon)#=> truehash_baru.value?(3)#=> true# Tip: Baik array maupun hash adalah Enumerable# Mereka berbagi banyak metode yang berguna diantaranya each, map, count, dll.# Struktur-struktur kendaliiftrue'pernyataan if'elsiffalse'else if, opsional'else'else, opsional juga'endforpenghitungin1..5puts"iterasi #{penghitung}"end#=> iterasi 1#=> iterasi 2#=> iterasi 3#=> iterasi 4#=> iterasi 5# NAMUN, tidak ada orang yang menggunakan pengulangan for.# Sebagai ganti, gunakan metode "each" dan memberinya sebuah blok (block).# Blok adalah serangkaian kode yang bisa dimasukkan ke metode seperti "each".# Ia serupa dengan lambda, fungsi anonim atau closure di bahasa lainnya.## Metode "each" dari range menjalankan blok untuk setiap elemen dari range.# Bloknya diberikan penghitung sebagai parameter.# Memanggil metode "each" dengan blok terlihat seperti ini:(1..5).eachdo|penghitung|puts"iterasi #{penghitung}"end#=> iterasi 1#=> iterasi 2#=> iterasi 3#=> iterasi 4#=> iterasi 5# Kamu juga bisa mengurung blok dalam kurung kurawal:(1..5).each{|penghitung|puts"iterasi #{penghitung}"}# Isi dari struktur-struktur data juga bisa di-iterasi menggunakan each.array.eachdo|elemen|puts"#{elemen} adalah bagian dari array"endhash.eachdo|kunci,nilai|puts"#{kunci} adalah #{nilai}"end# Jika kamu masih membutuhkan indeks, bisa menggunakan "each_with_index"# dan definisikan variabel indeksarray.each_with_indexdo|elemen,indeks|puts"#{elemen} adalah nomor #{indeks} dalam array"endpenghitung=1whilepenghitung<=5doputs"iterasi #{penghitung}"penghitung+=1end#=> iterasi 1#=> iterasi 2#=> iterasi 3#=> iterasi 4#=> iterasi 5# Ada kumpulan fungsi pengulangan lainnya yang berguna di Ruby,# contohnya "map", "reduce", "inject", daftarnya sangat panjang. Map,# misalnya, mengambil array yang di-iterasi-nya, melakukan sesuatu pada# setiap elemen sesuai definisi pada blok, dan mengembalikan array baru.array=[1,2,3,4,5]berganda=array.mapdo|elemen|elemen*2endputsberganda#=> [2,4,6,8,10]putsarray#=> [1,2,3,4,5]nilai='B'casenilaiwhen'A'puts'Pertahankan, nak'when'B'puts'Semoga lebih beruntung di lain waktu'when'C'puts'Kamu bisa lebih baik'when'D'puts'Susah payah'when'F'puts'Kamu gagal!'elseputs'Sistem penilaian lainnya, heh?'end#=> "Semoga lebih beruntung di lain waktu"# case juga bisa menggunakan rangenilai=82casenilaiwhen90..100puts'Hore!'when80...90puts'Cukup bagus'elseputs'Kamu gagal!'end#=> "Cukup bagus"# penanganan kesalahan (exception handling):begin# kode di sini yang mungkin membangkitkan exceptionraiseNoMemoryError,'Kamu kehabisan memori.'rescueNoMemoryError=>variabel_exceptionputs'NoMemoryError dibangkitkan',variabel_exceptionrescueRuntimeError=>variabel_exception_lainnyaputs'RuntimeError dibangkitkan sekarang'elseputs'Ini dijalankan bila tidak ada exceptions sama sekali'ensureputs'Kode ini akan berjalan bagaimanapun juga'end# Fungsi (atau metode)defgandakan(x)x*2end# Fungsi dan semua blok secara tersirat mengembalikan nilai pernyataan terakhirgandakan(2)#=> 4# Tanda kurung bersifat optional, boleh ditiadakan jika tidak ambigugandakan3#=> 6gandakangandakan3#=> 12defjumlah(x,y)x+yend# Argumen-argumen dari metode dipisahkan dengan komasum3,4#=> 7sumsum(3,4),5#=> 12# yield# Semua metode secara tersirat mempunyai parameter blok opsional# yang bisa dipanggil dengan kata kunci 'yield'defkurungputs'{'yieldputs'}'endkurung{puts'halo dunia'}# {# halo dunia# }# Kamu bisa memasukkan blok ke sebuah fungsi# "&" adalah penanda blok yang masukdeftamu_tamu(&blok)blok.call'beberapa_argumen'end# Kamu bisa memasukkan daftar argumen yang akan dikonversi menjadi array# Itulah gunanya operator splat ("*")deftamu_tamu(*array)array.each{|tamu|putstamu}end# Bila metode mengembalikan array, bisa memberi nilai dengan destrukturisasi# (destructuring assignment):defmakanan['tempe penyet','sayur asam','nasi goreng']endsarapan,makan_siang,makan_malam=makanansarapan#=> 'tempe penyet'makan_malam#=> 'nasi goreng'# Menurut adat, nama metode yang mengembalikan boolean diakhiri tanda tanya5.even?# false5.odd?# true# Dan jika suatu metode berakhiran tanda seru, ia melakukan sesuatu yang merusak# seperti mengubah penerimanya. Banyak metode mempunyai versi ! untuk melakukan# perubahan dan versi non-! untuk sekedar mengembalikan perubahannyanama_perusahaan="Putra Sejahtera"nama_perusahaan.upcase#=> "PUTRA SEJAHTERA"nama_perusahaan#=> "Putra Sejahtera"nama_perusahaan.upcase!# kali ini kita benar-benar mengubah nama_perusahaan!nama_perusahaan#=> "PUTRA SEJAHTERA"# Definisikan kelas menggunakan kata kunci classclassManusia# Variabel kelas. Ini dibagi oleh semua instans (instance) dari kelas ini.@@spesies='H. sapiens'# Inisialisasi dasardefinitialize(nama,usia=0)# Berikan argumen ke variabel instans "nama" dalam instans ini@nama=nama# Jika tidak diberi usia, nilai default dalam daftar argumen digunakan.@usia=usiaend# Metode setter dasardefnama=(nama)@nama=namaend# Metode getter dasardefnama@namaend# Fungsi di atas bisa disingkat dengan metode attr_accessor sebagai berikutattr_accessor:nama# Metode getter/setter juga bisa dibuat secara terpisah seperti iniattr_reader:namaattr_writer:nama# Metode kelas menggunakan self untuk membedakannya dari metode instans.# Ia hanya bisa dipanggil pada kelas, bukan pada instans-nya.defself.katakan(pesan)putspesanenddefspesies@@spesiesendend# Membuat instans kelasjim=Manusia.new('Jim Halpert')dwight=Manusia.new('Dwight K. Schrute')# Mari panggil beberapa metodejim.spesies#=> "H. sapiens"jim.nama#=> "Jim Halpert"jim.nama="Jim Halpert II"#=> "Jim Halpert II"jim.nama#=> "Jim Halpert II"dwight.spesies#=> "H. sapiens"dwight.nama#=> "Dwight K. Schrute"# Panggil metode kelasManusia.katakan('Hai')#=> "Hai"# Lingkup variabel didefinisikan berdasarkan bagaimana kita memberikannya nama# Variabel yang berawalan $ memiliki lingkup global$var="Aku adalah variabel global"defined?$var#=> "global-variable"# Variabel yang berawalan @ memiliki lingkup instans@var="Aku adalah variabel instans"defined?@var#=> "instance-variable"# Variabel yang berawalan @@ memiliki lingkup kelas@@var="Aku adalah variabel kelas"defined?@@var#=> "class variable"# Variabel yang berawalan huruf kapital adalah konstantaVar="Aku adalah konstanta"defined?Var#=> "constant"# Kelas juga adalah objek sehingga kelas bisa memiliki variabel instans.# Variabel kelas dibagi diantara kelas dan semua pewarisnya.# kelas dasarclassManusia@@foo=0defself.foo@@fooenddefself.foo=(nilai)@@foo=nilaiendend# kelas turunanclassBuruh<ManusiaendManusia.foo# 0Buruh.foo# 0Manusia.foo=2# 2Buruh.foo# 2# Variabel instans milik kelas tidak dibagikan dengan pewaris kelas tersebut.classManusia@bar=0defself.bar@barenddefself.bar=(nilai)@bar=nilaiendendclassDokter<ManusiaendManusia.bar# 0Dokter.bar# nilmoduleContohModuldeffoo'foo'endend# Include modul mengikat metode-metodenya pada instans-instans kelas# Extend modul mengikat metode-metodenya pada kelasclassOrangincludeContohModulendclassBukuextendContohModulendOrang.foo# => NoMethodError: undefined method `foo' for Orang:ClassOrang.new.foo# => 'foo'Buku.foo# => 'foo'Buku.new.foo# => NoMethodError: undefined method `foo'# Callbacks dijalankan ketika meng-include dan meng-extend sebuah modulmoduleContohUrusandefself.included(base)base.extend(MetodeKelas)base.send(:include,MetodeInstans)endmoduleMetodeKelasdefbar'bar'endendmoduleMetodeInstansdefqux'qux'endendendclassSesuatuincludeContohUrusanendSesuatu.bar# => 'bar'Sesuatu.qux# => NoMethodError: undefined method `qux'Sesuatu.new.bar# => NoMethodError: undefined method `bar'Sesuatu.new.qux# => 'qux'