Ruby :: Strings

Posted by PunNeng, Sat Dec 09 04:14:00 UTC 2006

Ruby เป็นภาษาที่ง่ายๆ ครับ ถ้าเกิดคุ้นเคยกับภาษาอื่นๆ มาแล้ว เราก็สามารถที่จะเข้ามาเรียนรู้กับ Ruby ไม่ยากครับ แต่สำหรับคนที่ไม่เคยหัดมาก่อน หรืออยากจะหัดเขียนโปรแกรมด้วยภาษา Ruby เป็นภาษาแรก หรืออยากจะเริ่มต้นกับมันอย่างจริงจัง ตัว Syntax นี่จะสามารถสร้างความสนุกสนาน(หรือเปล่า?)และง่ายต่อการเข้าใจ(ไม่แน่ใจ ==')ในการเขียนโปรแกรมได้อย่างแน่นอน

มาเริ่มกันด้วย String ครับ String ใน Ruby ก็คล้ายกับในภาษาอื่นๆ น่ันแหละครับ มันจะมีความ dynamic กลายร่างได้ และก็ยังมีความยืดหยุ่น มาดูกัน ว่ามันทำอะไรได้บ้าง เปิด irb ขึ้นมาลองกันได้ ลองพิมพ์เข้าไปว่า

string = "My first string"

มันก็น่าจะได้ผลมาดังนี้

ซึ่งในครั้งๆ ต่อไป ผมจะย้าย => "My first string" ไปอยู่ด้านขวาแทน แล้วใส่ comment(#) เอาไว้ หรือวางไว้ตามสมควร

ใน ​Ruby ทุกสิ่งทุกอย่าง สามารถใส่ในตัวแปรที่เป็น Object ได้ ซึ่งตามตัวอย่างข้างบน ตัวแปร string จะชี้ไปยัง object ของคลาส String ซึ่งคลาสๆ นี้ มันบรรจุ method อะไรไว้เยอะแยะไปหมด ผมจะแสดงให้ดูเรื่อยๆ ตามที่แปลมาละกันครับ เริ่มด้วยนับจำนวน byte ละกันครับ นับ byte นะครับ ไม่ใช่นับตัวอักษร Ruby จะเรียกโดย

string.length                # => 15

ภาษาอื่นๆ สามารถเรียกได้โดย

string.length()              # => 15

ใน Ruby เราจะเรียกได้หลายวิธีครับ ในกรณีนี้ เราไม่ส่ง argument ไปให้ String#length แต่ถ้าหากจะส่ง เราสามาถใส่มันไว้ในวงเล็บก็ได้ แบบนี้

string.count 'i'              # => 2  # => มี i โผล่มา 2 ครั้ง
string.count('i')             # => 2

ผลของการ return จะออกมาเป็น object ในกรณีของ String#length มันจะ return ตัวเลขจำนวน byte ออกมา ซึ่งตัวเลข จะเป็นคลาส Fixnum เราสามารถเรียก method ต่อได้อีก โดย

string.length.next            # => 16

มาลองดูที่มันยุ่งเหยิงขึ้นอีกหน่อยนึงนะ มาดูว่าถ้าเราเกิดเก็บอะไรที่มันไม่ใช่อักขระ ascii ขึ้นมา ถ้ามันเกิดเก็บภาษาไทยสักตัว เช่น "My name is เหน่ง" มันจะถูกเข้ารหัสเป็น UTF-8 ทันที เพราะฉะนั้น ถ้าเราจะใส่ภาษาไทย จะถูกเข้าให้เป็น

thai_string = "My name is \340\271\200\340\270\253\340\270\231\340\271\210\340\270\207"

Ruby จะเก็บ String เป็นชุดของ byte ซึ่งตัวอย่างข้างบน จะมี ตัวอักษรทั้งหมด 13 ตัว และช่องเว้นวรรคอีก 2 ตัว ถ้าเราใช้ String#length นับดู เราก็น่าจะเดาว่ามันน่าจะ return มาเป็น 15 ถูกไหมครับ แต่จริงๆ มันเก็บเป็น byte ครับ ภาษาไทยมันจะใช้พื้นที่ในการเก็บ 3 byte

thai_string.length             # => 26

ผมถึงบอกข้างต้นว่า มันนับเป็น byte ครับ สำหรับการจัดการกับพวกที่ต้อง encode ที่ซับซ้อน ถ้าแปลถึง คงได้อ่านกันครับ

ร่ำกันต่อ Ruby มีวิธีการ escape string หลายวิธีครับ ขึ้นอยู่กับว่าเราจะสร้าง string ขึ้นมาในลักษณะไหน ถ้าเราครอบ string ด้วย double quote (") มันก็จะเข้ารหัสข้อมูลในระดับ binary ให้เป็น string(เหมือนที่ทำกับภาษาไทยข้างบน) และก็สามารถที่จะเข้ารหัสตัวอักขระที่ไว้ขึ้นบรรทัดใหม่(\n) เหมือนๆ กับภาษาอื่นๆ

puts "This string\ncontains a newline"
# This string
# contains a newline

แต่ถ้าครอบ string ด้วย single quote (') เราสามารถใช้ "\'" ในการแสดงตัว single quote และ "\\" ในการแสดงตัว backslash

puts 'it may look like this string contains a newline\nbut it doesn\'t'
# "it may look like this string contains a newline\nbut it doesn't"

puts 'Here is a backslash \\'
# Here is a backslash \;

มันมีเบื้องลึกเบื้องหลังสำหรับพวก escape string และพวกอักขระพิเศษอีก ไว้เดี๋ยวเจอกัน

เรายังสามารถสร้าง string ในลักษณะ "here document" โดย

long_string = <<EOF
Here is a long string
With many paragraphs
EOF
# => "Here is a long string\nwith many paragraphs\n"

puts long_string
# Here is a long string
# With many paragraphs

มาดูรูปแบบอื่นกันต่อ อย่างเช่นตอนต้นที่เล่าไว้ คือ Ruby มันแสนจะยืดหยุ่น การสั่งงานให้ทำอะไรบางอย่าง อาจจะทำได้หลายวิธี เช่น อยากจะเก็บเอาตัวอักษรออกมาใช้ เราสามารถทำได้โดยการใช้ String#slice

string                    # => "my first string"
string.slice(3,5)         # => "first"

แต่ถ้าคนที่เติบโตมากับภาษา C แล้วก็คิดว่า string เนี่ย มันเป็นชุดของ byte ที่เก็บในรูปของ array ตัว Ruby ยังสามารถจัดการให้ได้ มันยังสามารถเก็บ byte ของ string แล้ว return ตัว byte น้ันๆ ออกมาในรูปของตัวเลขได้

string.chr + string.chr + string.chr + string.chr + string+chr
# => "first"

และถ้าหากว่าโตมากับ Python ยังสามารถหั่นแบบนี้ได้อีก

string[3,5]                 # => "first"

แต่ Ruby ก็ยังมีความแตกต่างจากภาษาอื่นๆ เหมือนกัน ตรงที่มันกลายร่างได้ กลายร่างยังไง ก็คือการเปลี่ียนแปลงตัวเองโดยตัวเอง โอ้ย งง!! มาดูกันที่ String#upcase กับ String#upcase!

string.upcase               # => "MY FIRST STRING"
string                      # => "my first string"

string.upcase!              # => "MY FIRST STRING"
string                      # => "MY FIRST STRING"

นี่เป็นหนึ่งใน syntax ของ Ruby ซึ่งเป็นสิ่งที่อันตรายของ​ Ruby ตัว method หลายๆ ตัวของ Ruby สามารถมีเครื่องหมายตกใจ (!) ตามหลัง ถ้าเรียกใช้ มันจะเปลี่ยนค่าในตัวมันเองเลย syntax อีกแบบคือ มันจะ return ค่า true หรือ false เท่านั้น โดยสังเกตได้จากการที่มันมีเครื่องหมายคำถาม(?) ตามหลัง (เหมือนภาษา Lisp)

string.empty?                     # => false
string.include? 'MY'              # => true

นี่เป็นตัวอย่างของการใช้เครื่องหมายต่างๆ มาเป็นตัวบอกความหมายให้กับโปรแกรมเมอร์ ทำให้อ่าน code ได้ง่ายขึ้น เข้าใจมันได้ง่ายขึ้น มาจากหลักการของพี่ Matz ที่ว่า "Ruby is a language primarily for humans to read and write, and secondarily for computers to interpret" ขอแปลเป็นภาษาของผมว่า Ruby เป็นภาษาที่มีหนัาที่หลักคือ ให้มนุษย์อ่านและเขียน และหน้าที่รองคือให้คอมพิวเตอร์แปล(มันมีนัยสำคัญหลายจุดแฮะ แค่ประโยคๆ เดียว)

ตัว interactive ruby(irb) เนี่ย เป็นสิ่งที่ขาดไม่ได้นะครับ สำหรับการทดลองอะไรต่างๆ ใน Ruby ผมแนะนำว่าให้ลองของพวกนี้ใน irb หรือว่า fxri นะครับ แล้วเราจะใช้ Ruby คล่องขึ้นเอง

อีกนิดนึง เราสามารถที่จะดูข้อมูลต่างๆ ของ method ต่างๆ ได้โดยการพิมพ์ ri แล้วตามด้วย method นั้นๆ เช่น

ri "String#upcase!"

"why the lucky stiff" ได้เขียนคำแนะนำ ในการติดต้ังและการใช้ irb และ ri ไว้ที่ http://poignantguide.net/ruby/expansion-pak-1.html เข้าไปแล้วครับ การ์ตูนเขียนฮาดี และสำหรับคนที่สนใจหลักการ ปรัชญาของพี่ Matz นะ สามารถไปอ่านบทสัมภาษณ์ของพี่แกได้ที่ http://www.artima.com/intv/ruby.html

แก้ไขล่าสุด วันที่ 19 กรกฏาคม 2550 เวลา 23.57 น.

Filed Under: Ruby | Tags: ruby string

Comments

Have your say

A name is required. You may use HTML in your comments.




codegent: we're hiring