Skip to content

Instantly share code, notes, and snippets.

@wingyplus
Created September 10, 2011 12:57
Show Gist options
  • Save wingyplus/1208280 to your computer and use it in GitHub Desktop.
Save wingyplus/1208280 to your computer and use it in GitHub Desktop.
Ruby Note for me.

Ruby

เริ่มแรก

puts "hello, world"

สิ่งที่ต้องจำไว้

  • Ruby ใช้เป็น code block ไม่ได้ใช้ {} ครอบ block นั้น
  • Ruby จะเรียกใช้ class Kernel โดยอัติโนมัติ

require โหลดเป็น path

Variables

  • ตัวแปรเป็นแบบ Dynamic Type

  • ถ้าตั้งชื่อด้วยตัวใหญ่จะถือว่าเป็น constants

  • ถ้าต้องการใช้ตัวแปรแบบ global ให้ใส่ $ นำหน้าชื่อ เช่น

    $globalvar
    

    ตามข้างบนนั้นเป็นตัวแปรแบบ global ที่ชื่อ globalvar

  • ถึงแม้ชื่อตัวแปรแบบ local กับ global เหมือนกันแต่มันเป็นคนละตัวกัน

  • constants สามารถ reassign ได้แต่เกิด warning: already initialized constant ไม่ error!

Operators

  • = จะหมายถึงการ assign ค่าให้กับตัวแปร แต่ == นั้นจะเป็นการเปรียบเทียบ

Boolean and Expression

If and Unless

  • if และ unless เป็นเงื่อนไข ถ้า expression นั้นเป็น จริง(true) จะเข้าไปทำ statement ในบลอกของ if หรือ unless

  • unless จะตรงข้ามกับ if (แปลกันง่ายๆ if แปลว่า "ถ้า" unless แปลว่า "ถ้าไม่" แสดงว่าความหมายมันตรงข้ามกัน)

  • form ของ if..else นั้นคือ

    if condition [then]
    	statement...
    end
    
  • และ สามารถใช้ and หรือ && ได้ และยังสามารถใช้แบบพวกภาษา C/C++ หรือ Java หรือ Go ใช้ก็ได้ (&&, ||, !)

  • สามารถใช้ clause แบบ ternary เหมือน C/C++ ได้ เช่น

    x == 10? puts("it's 10") : puts("it's some other number")
    
  • เมื่อใช้ === จะหมายถึงการเชคว่าเป็น member ของ range หรือใช้ method include?

Case

case i
  when 1 
	puts "It's Monday" 
  when 2  
	puts "It's Tueday"
  when 3
	puts "It's Wednesday"
  when 4
	puts "It's Thursday"
  when 5
	puts "It's Friday"
  when 6
	puts "It's Saturday"
  when 7
	puts "It's Sunday"
  else puts "That's not a real day!"
end

Example

age = 10
if age >= 18
	puts "you're too young to use this system."
end
# result is null
unless age >= 18
	puts "you're too young to use this system."
end
# result is you're too young to use this system.

Catch and throw

  • ลักษณะคล้าย goto method catch เอาไว้บอกว่าเป็น label ไหน(ประกาศเป็น symbol) และเมื่อเกิดการ throw นั้นโปรแกรมจะวิ่งไปหา ท้าย block ของ catch

    def dothing(aNum)
      i = 0
      while true
    	puts "I'm doing things..."
    	i += 1
    	throw :go_for_tea if i == aNum
      end
    end
    
    catch :go_for_tea do
      puts "begin"
      dothing 5
    end
    
    puts "end"
    

String

Heredoc

ทำให้เขียน string ในหลายบรรทัดได้ วิธีการคือ ใส่ <<word ไว้ที่หัวเมื่อต้องการใช้ heredoc และปิดด้วย word เมื่อต้องการปิดข้อความ (ซึ่ง word คือคำอะไรก็ได้)

Example

hdoc1 = <<EODOC
I wandered lonely as a #{"cloud".upcase}
That floats on high o'er vale and hill...
EODOC

Array

สามารถสร้างเป็น range แล้วใช้ method to_a เพื่อแปลงเป็น array

Example

a = ('a'..'z').to_a
b = ('a'...'z').to_a
  • การ copy array ใช้ method clone (เพราะว่าเมื่อเรา assign array ให้กับอีกตัวแปรค่าจะเปลี่ยนตามกัน)

  • append ใช้ << เช่น a << b ผลลัพธ์จะได้ประมาณ ["key1", "key2", "key3", "key4", ["key1", "key3", "key4", "KEY_TWO"]]

  • intersection ใช้ &

  • concatinate ใช้ +

  • difference ใช้ -

  • flatten method ใช้แตก array ใน array ให้เป็น value เช่น

    a=[1, 2, 3, [4, 5, 6]] a.flatten #=> [1, 2, 3, 4, 5, 6]

  • method push เอาไว้เพิ่ม data ลง array นั้น

  • method pop เอาไว้ดึง data ออกจาก array และลบข้อมูลจาก array นั้น

Loop

For Loop

for i in [1,2,3] do
	puts i
end

วิธีิมองคือ ให้เอาค่าใน list มากระทำ แต่ Ruby นั้นมี syntax sugar นั้นก็คือ Each

Each Loop

[1,2,3].each do |i|
	puts i
end

each นั้นจะโยนค่าใน list เข้าไปใส่ใน i เราสามารถเอาของพวกนี้มาใช้กับ Hash ได้อีก เช่น

h1 = { "room1" => "The Treasure Room", "room2" => "The Throne Room", "loc1" => "A Forest Glade", "loc2" => "A Mountain Stream" }

h1.each do |k,v|
  puts "#{k} is #{v}"
end

While Loop

  • Example

    $x = 1
    
    def tired 
      return false if $x == 10
      true
    end
    
    def sleep
      puts "sleep"
    end
    
    while tired
      sleep
      $x += 1
    end
    

while นั้นจะทำงานโดยทำการตรวจสอบเงื่อนไขจาก condition ที่กำหนดไว้ (ในที่นี้คือ tired) และจะออกจาก loop ก็ต่อเมื่อ condition ไม่ถูกต้อง(หรือเป็น false นั้นเอง) เราสามารถเขียน while loop อีกแบบได้ เรียกว่า while modifiers

$x = 1

def tired 
  return false if $x == 10
  true
end

def sleep
  puts "sleep"
end

begin
  sleep
  $x += 1
end while tired

while modifiers มองดีๆ มันก็คล้าย do..while ใน C/C++ หรือ Java นั้นเอง หรือสามารถเขียนบรรทัดเดียวก็ได้เพื่อให้สั้น แต่ statement นั้นต้องมีอันเดียว

puts "x < 100" while x < 100

Until Loop

จุดที่เอาไว้จำนั้นคือ มันคือ while loop แต่เงื่อนไขตรงกันข้าม เช่น

i = 1
while i == 10
  puts i
  i += 1
end

i = 1
until i == 10
  puts i
  i += 1
end

ถ้ามองในความหมายของ while คือ จะทำข้างใน block ก็ต่อเมื่อ i = 10 แต่ความหมายของ until จะตรงกันข้าม

Loop

loop เป็น method ที่เอาไว้วนรอบแบบไม่รู้จบโดยมันจะเข้าไปทำ statement ที่อยู่ใน {} หรือว่า do..end นั้น(ใช้ได้ทั้งสองแบบ)

ตัวอย่าง

arr = [1,2,3,4,5,6]
i = 0

loop do
  puts arr[i]
  i += 1
  break if i == arr.length
end

# or
# loop {
#   puts arr[i]
#   i += 1
#   break if i == arr.length
# }

Method

  • ใช้ keyword def และเมื่อจบ method ให้ปิดด้วย keyword end

  • parameter ต่อหลังชื่อ method ถ้ามีหลายตัวให้ใช้ , คั่นระหว่าง parameter

    def say msg
    	puts "Hello " + msg
    end
    
  • method ระดับ class จะประกาศเป็น def <ClassName>.<MethodName> เช่น

    def MyClass.classMethod
    	puts "This is a class method"
    end
    
  • Override Method ถ้าต้องการให้เรียกใช้ Method ของคลาสแม่ด้วย ใช้ super

    class MyClass
      def sayHello
    	return "Hello from MyClass"
      end
      
      def sayGoodbye
    	return "Goodbye from MyClass"
      end
    end
    
    class MyOtherClass < MyClass
    	# Override and Replace
      def sayHello
    	return "Hello from MyOtherClass"
      end
      	# Override but call Method superclass
      def sayGoodbye
    	return super << " and also from MyOtherClass"
      end
    end
    
  • เราสามารถใช้ method send เพื่อเข้าไปเรียกใช้ method ที่มี accessmodifiers แบบ private หรือ protected ได้

    ob.send(:methodname)
    
  • singleton method ทำได้ด้วยประกาศ def objectname.methodname (argument)

  • singleton class ประกาศ class << objectname

  • nested method ใช้เพื่อประกาศ method ใน method อีกทีซึ่งต้องเรียก method ที่หุ้ม nested method ก่อน ดังตัวอย่าง

    class X
      def x
    	puts "x:"
    	
    	def y
    	  puts "y:"
    	end
    	
    	def z
    	  puts "z:"
    	  y
    	end
      end
    end
    
    ob = X.new
    ob.x
    ob.y
    ob.z
    
  • ถ้าชื่อ method ขึ้นด้วยตัวใหญ่ Ruby ต้องใส่ () ติดหลังไปด้วย ไม่เช่นนั้นจะถือว่านั้นคือ constant เช่น

    def Fred
      puts "say"
    end
    
    Fred   # uninitialized constant Fred (NameError)
    Fred() # output say
    

Class

  • ชื่อของคลาสเป็น constants

  • วิธีสร้าง class คือ ใช้ keyword class แล้วตามด้วยชื่อ class และจบ class ด้วย keyword end

    class ... property and method ... end

Object

เมื่อมีเรื่องของ class มันก็ต้องมี Object เป็นของคู่กัน วิธีสร้าง Object ทำดังนี้

man = Person.new

ดังข้างบนนั้น ถ้ามองตามรูปการณ์แล้วคือ ตัวแปร = ชื่อคลาส.สร้าง นั้นเอง :D

Constructor

constructor นั้นเอาสร้างค่าเริ่มต้นให้กับ Object นั้นๆ โดยทางฝั่งคลาสนั้นจะต้องประกาศ method ชื่อ initialize เช่น

def initialize aName
	@name = aName
end

เมื่อสร้างแล้ว ทางฝั่งของ Object นั้นจะใส่ค่าไปตอนสร้าง Object

man = Person.new "win"

เท่านี้ property name ในคลาสจะถูก assign ให้เท่ากับ "win" นั้นเอง

Class Variables

ใช้เครื่องหมาย @@ นำหน้าชื่อตัวแปร เมื่อมี Object เปลี่ยนค่า มันจะไปเปลี่ยนค่าของ Object ตัวอื่นด้วยเพราะว่ามัน share ค่าของตัวแปรระหว่างคลาสกัน

Encapsulation

เป็นการเข้าถึงด้วย method โดยกำหนดค่าผ่าน setter และนำค่าออกมาดูผ่าน getter

Example

# setter method
def name=(aName)
	@name = aName
end

# getter method
def name
	return @name
end
  • ข้อสังเกต
    • setter นั้นไม่สามารถใช้ def name = (aName) ได้ จะทำให้เกิด error

หรือสามารถใช้ method attr เพื่อสร้าง setter และ getter ซึ่งมีให้ใช้ 3 แบบ(จริงๆแล้วคือ method ในคลาส Module)

  • attr_accessor สามารถอ่านและเขียน หรือเปลี่ยนแปลงได้ (,มันสร้าง setter และ getter ให้นั้นเอง)
  • attr_writer เมื่อเรียกมันจะสร้าง setter ให้
  • attr_reader เมื่อเรียกมันจะสร้าง getter ให้

Example

class Person
	# สร้าง method getter และ setter ให้โดยอัติโนมัติ
	attr_accessor :name
	# สร้างให้แค่ method setter อย่างเดียว 
	attr_writer :description
	# สร้าง method getter อย่างเดียว
	attr_reader :age
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment