Iseng buka Kaskus ada Info menarik dan patut untuk dipelajari dari agan Magico, Bagi yang belum mengerti Ruby pasti Berpikir kalo ruby itu SUSAH.. Ya okelah.. Makanya belajar, berikut penjelasan agan
MAGICO
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Berhubung Java ane mentok, ane refreshing dulu de bikin thread ruby disini..
Ruby itu adalah language yang pure Object Oriented. Tidak ada primitives di Ruby. Dari mulai definisi sampai operator seluruhnya adalah object.
Ruby adalah strong typed language. Artinya Ruby memiliki tipe data yang baku. Contoh:
Code:
a = "test" #-> string
a = 123 #-> berubah integer
a = (1..4) #-> berubah range
a = a.to_a #->berubah array
Kemudian Ruby adalah convention over configuration. Artinya Ruby mengutamakan konvensi penulisan. Misalnya dalam penulisan variable:
Code:
$global #-> global variable
@instance #-> instance variable
@@class #-> class variable
lokal #-> local variable
CONSTANT # -> Constants
Class #-> Constant names
:symbol #-> symbol
Kemudian untuk data type, ruby mengenal beberapa data type basic dibawah ini:
Code:
a="1"
a.class #-> String
a.to_i
a #-> 1
a.class #-> Fixnum
/[,\[\]]/.class #-> Regexp
123.45.class #-> Float
:sym.class #-> Symbol
(1..4) #-> range
[1..4] #-> array
{:kaskus => "www.kaskus.us", :google => "www.google.com"} #-> Hash
a=<
Daftar Makanan
1. Es Krim
2. Donat
3. Nasi goreng
MAKANAN
a #-> "Daftar Makanan\n1. Es Krim\n2. Donat\n3. Nasi goreng\n
a.class #-> String
Selain itu, apapun yang kita berikan pada Ruby, akan selalu dianggap sebagai instance baru. Contoh berikut, akan memberikan 2 buah String instances
Code:
irb> "hastalavista beibeh".object_id
32564740
irb> "hastalavista beibeh".object_id
32577260
Ada beberapa control structure, yang cukup standard yang dimiliki Ruby:
Yang pertama adalah if-elsif-else dan unless
Code:
a=5
if a==4 then b="ok" else b="no" end
Code:
unless a==4
b="no"
end
Cara penulisan tersebut bisa juga dirubah menjadi
Code:
b="ok" if a==4
Code:
b="no" unless a==4
Code:
b=(a==4 ? "ok" : "no")
Code:
case
when a < 5 then "fail"
when a == 5 then "barely pass"
when a > 5 then "pass"
end
Code:
case a
when 0..4 then "fail"
when 5 then "barely pass"
when 6..7 then "ok"
when 8..9 then "good"
when 10 then "perfect!"
else "huh?"
end
Code:
result = case a
when 0..4 then "fail"
when 5 then "barely pass"
when 6..7 then "ok"
when 8..9 then "good"
when 10 then "perfect!"
else "huh?"
end
Code:
puts case a
when 0..4 then "fail"
when 5 then "barely pass"
when 6..7 then "ok"
when 8..9 then "good"
when 10 then "perfect!"
else "huh?"
end
Code:
while a<10
a++
end
until a>=10
a++
end
Code:
a++ while a<10
a++ until a>=10
Oh.. satu lagi.. ane lupa.. pada while, until, bisa dilakukan block pada statement tersebut misalnya
Code:
a++ until a>=10
Code:
begin
a++
end until a>=10
Code:
for a in (0..5)
puts a
end
Code:
5.times do |i| puts i end
Code:
5.times { |i|
puts i
}
Code:
a=%w(juragan bakso)
a.each { |i|
puts "ini #{i}"
}
Code:
ini juragan
ini bakso
Code:
m=false
10.times { |i|
next if i < 3
break if i > 8
puts "ini #{i}"
unless m || i != 6
m=true
redo
end
}
Code:
ini 3
ini 4
ini 5
ini 6
ini 6
ini 7
ini 8
Berhati hatilah dengan redo, karena salah logic bisa menyebabkan infinite loop.
kemudian retry berfungsi untuk mengulang struktur tersebut. Bisa dilakukan pada loop, tetapi biasa berguna dalam exception trapping. Contoh
Code:
a=0
b=5.0
begin
c=b/a
rescue error1
puts "ERROR1"
rescue error2
puts "ERROR2"
rescue ZeroDivisionError
a=2
retry
ensure
puts c
end
EDIT1: Tambahin Control Blocks
EDIT2: Kelupaan Regexp data type
Notasi
Ruby memiliki notasi yang cukup standard, seperti
Code:
0x0F #->hex
0b0000001 #->binary
0544 #-> octal
?a #-> character code dari "a"
Code:
\n
\r
\f # ->form feed
\b # -> backspace
\a # -> bell
\e # -> escape
\s # ->space
\nnn # -> Octal notation
\xnn # -> Hex notation
\cx. #C-x -> Ctrl-x
\x # #-> karakter x
Contoh pada method:
Code:
authenticated?(uid, pwd)
Code:
defined? super #-> apakah bisa memanggil super?
defined? a #-> apakah variable a telah didefinisikan?
defined? puts #-> "method" exists.
Code:
to_a!
Operators
Arithmetic
Untuk perhitungan, operator cukup standard, yaitu +, -, *, /, % dan exponential adalah ** (bukan ^), demikian pula dengan assignment seperti *=, +=, dst.
Comparison
Yang cukup standard adalah ==, <=, =>, > dan <. Kemudian Ruby memiliki beberapa operator tambahan, yaitu:
<=> - Ini adalah combined operator. Hasilnya adalah 0 bila kedua operand sama, 1 bila yang dikiri lebih besar, dan -1 bila yang dikanan lebih besar.
=== - Ini adalah membership. Misalnya (1..10) === 5 akan menghasilkan true karena 5 adalah member dari 1 hingga 10
kemudian ada 2 buah comparison method, yaitu:
.eql? yang membandingkan tipe dan value.
.equal? yang membandingkan object_id.
Parallel Assignment
Contoh kita akan mengisi 3 buah variable:
Code:
a=1
b=2
c=3
Code:
a,b,c = 1,2,3
Code:
a,b = b,c
Sekarang mengenai manipulasi variable basic
String
String memiliki kemampuan object parsing, seperti PHP. Jadi kita bisa memberikan beberapa expression dalam string. Contoh:
Code:
x,y,z = 10,20,30
puts "x value adalah #{x}"
puts "x + Y = #{x + y}"
puts "rata rata xyz adalah #{(x+y+z)+3}"
Code:
%Q{ Test Test #{x} } # ->" Test Test 10 "
%q{ Test Test #{x} } # " Test Test #{x} "
Code:
u -> UTF-8
n -> ASCII
e -> EUC
a -> ASCII
Code:
$KCODE = 'u'
Operasional pada String, lengkapnya bisa dilihat disini
http://ruby-doc.org/core/classes/String.html
Tetapi ada beberapa operasi yang mungkin bakal sering dipake
Operator:
Code:
"%05d" % 123 # "00123"
s="Ha " * 3 # Ha Ha Ha
s << "! # Ha Ha Ha!
Code:
"juragan".casecmp("JURAGAN") # 0
"juragan"[3..6] # "agan"
"juragan bakso".each(' ') { } # jadi 2 array, juragan dan bakso
"string\nline".each_line { } #line array
"string".each_char { }
Code:
a = "hello there"
a[/[aeiou](.)\1/] #=> "ell"
a[/[aeiou](.)\1/, 0] #=> "ell"
a[/[aeiou](.)\1/, 1] #=> "l"
a[/[aeiou](.)\1/, 2] #=> nil
a["ell"] # => 'ell' (search for ell)
a["bye"] # => nil (search for bye)
"hello".gsub(/[aeiou]/, '*') #=> "h*ll*"
"abcd".insert(0, 'X') #=> "Xabcd"
a.scan(/(..)(..)/) #=> [["he", "ll"], ["o ", "th"], ["er", "e"]]
Ada beberapa cara untuk membentuk array
Code:
arr = []
arr = Array.new(20)
arr = Array.new(4,"bla") # -> ['bla','bla','bla','bla']
Code:
arr = Array.new(5) { |i| i = i * 2 } # => [0, 2, 4, 6, 8]
Code:
arr1 = [1,2,3]
arr2 = [3,4,5]
arr1 << 4 # => [1,2,3,4]
arr1 & arr2 # => 3
arr1 * 2 # > [1, 2, 3, 1, 2, 3]
arr1 + arr2 # => [1, 2, 3, 3, 4, 5]
arr1 - arr2 # => [1, 2]
arr1 | arr2 # => [1, 2, 3, 4, 5]
arr1.delete(2) #=> [1, 3]
arr1.delete_at(2) # [1, 2]
arr1.delete_if {|i| .... } # delete kalau block mengeluarkan hasil true
arr1.length # => 3
Class
Definisi class di Ruby adalah:
Code:
class Customer
end
Tidak dibutuhkan constructor di Ruby, tetapi bila mau kita bisa menambahkan
Code:
class Customer
@@customer_no = 0
def initialize(id, name)
@cust_id=id
@cust_name=name
@@customer_no++
end
end
Code:
customer = Customer.new('m1', 'magico')
Ingat, customer adalah instance object, dan Customer adalah constant object, terlihat dari huruf besar dan kecil yang mendefinisikannya. Karena itu method, selalu didefinisikan dengan huruf kecil. Contoh:
Code:
class Customer
def beli(itemid)
@item=Item.new(itemid)
end
def self.beli(itemid)
return Item.new(itemid)
end
end
self adalah apa yang disebut sebagai static pada bahasa lain. Untuk memanggil self, digunakan
Code:
Customer::beli('m45-355s')
Customer.beli('m45-355s')
Code:
s = Customer.new
s.beli('m45-355s')
Kalau masih ingat mengenai variable scope diatas, kita bisa membuat @@item sehingga item yang dibeli oleh customer tersebut ter-update untuk seluruh instance. Contoh:
Code:
class Customer
@@test1=0
@test2=0
def add
@@test1++
@test2++
end
def print
puts "#{@@test1}/#{@test2}"
end
end
a=Customer.new
b=Customer.new
a.add
b.add
a.print # -> 2/1
b.print # -> 2/1
a.add
a.print # -> 3/2
b.print # -> 3/1
Code:
def method(var1=value1, var2=value2)
end
Code:
def test
a=1
b=2
c=3
end
a=test #-> 3
Sedangkan return memiliki kemampuan untuk mengembalikan beberapa value sekaligus. Contoh:
Code:
def test
return 1,2,3
end
s=test # -> [1,2,3] dalam bentuk array
Code:
def test (*a)
puts "jumlah parameter #{a.length}"
a.length.times{ |i|
puts "parameter ke #{i} adalah #{a[i]}"
}
end
Code:
def test (*a)
puts "jumlah parameter #{a.length}"
a.length.times{ |i|
puts "parameter ke #{i} adalah #{a[i]}"
}
end
undef test
Overloading, inheritance, singleton
untuk overload method, atau menambahkan method, kita cukup melakukan
Code:
class Test
def overloaded
100
end
def original
10
end
end
Code:
class Test2 < Test
def overloaded
super
200
end
def newmethod
20
end
end
Code:
test1=Test2.new
test2=Test2.new
def test2.newmethod
30
end
test2.newmethod # -> 30
test1.newmethod # -> 20
Modules
Sekarang mengenai "class" kedua yang dimiliki Ruby, yaitu class yang tidak bisa di-inherit. Class ini disebut module. Dalam Ruby, ini disebut mixin. Bisa juga untuk mendefinisikan namespace.
Contoh:
customer.rb
Code:
module Customer
DEALER=25
USER=0
def self.discount(type)
return type
end
end
Code:
module Barang
PPN = 10
def self.pajak(jenis)
return jenis
end
end
Code:
require 'customer'
Customer::DEALER
Customer.discount(CUSTOMER::USER)
Code:
require 'customer'
class Customers
include Barang
def hitung
return Barang.pajak(Barang::PPN)
end
end
c = Customers.new
c.pajak
c.hitung
Bisa juga kita menambahkan
Code:
class Customers
include Barang
include Customer
def hitung
end
end
Dengan cara ini, kita bisa membuat method method yang common digunakan pada beberapa class, dan me-mixin ke dalam class class tersebut.
Attributes
Pada bahasa yang lain, kita biasa menggunakan
Code:
private String attribute;
function getAttribute() {}
function setAttribute(String attr) {}
Code:
@attribute = ""
def attribute
return @attribute
end
def attribute=(a)
@attribute = a
end
Code:
attr_accessor :attribute1, :attribute2 # -> get/set
attr_reader :attribute # -> get only
attr_writer :attribute # -> set only.
Di dalam Ruby, class adalah instance dari object Class. Perhatikan tanda "C" huruf besar, dan deklarasi class dengan "c" huruf kecil. Pada Ruby, class Customer berarti kita memanggil method class dengan parameter Customer. Karena itu, dalam Ruby setiap Class object memiliki beberapa Class method dan properties, yang akan di-inherit oleh setiap class yang didefinisikan. Beberapa diantaranya adalah to_s, method_missing, to_i, dst, yang otomatis akan ada pada instance walaupun kita tidak mendefinisikannya. Karena itu, bila kita tidak mendefinisikan class tersebut inherit dari class lain, maka default Ruby adalah
Code:
class ClassName < Class
end
Code:
Class.instance_methods
Class.private_methods
Class.methods
Yang biasa di-overload adalah:
Code:
to_s
method_missing
Code:
send "method", "parameters"
Code:
class Class
def test
end
end
Tapi peringatan dari ane, kalau melakukan ini, BE CAREFUL.
0 comments:
Post a Comment