Ruby Standard Library เป็นชุดของ modules และ classes ที่มาพร้อมกับ Ruby แต่ไม่ใช่ส่วนหนึ่งของภาษาเอง คลาสเหล่านี้เสนอ utilities หลากหลายอย่างเช่น:
- Base64 encoding
- Prime number generation
- DNS resolution
ในบทความนี้จะแนะนำ 5 คลาสพร้อมตัวอย่างที่มีประโยชน์
คลาส Logger ของ Ruby
ถ้าคุณต้องการ log error หรือ debug message Ruby มี Logger class ให้ใช้งาน คลาสนี้ให้ทุกอย่างที่ต้องการสำหรับการเริ่ม logging!
การใช้ Logger class: สร้าง Logger object และส่ง output stream (หรือชื่อไฟล์) เป็น parameter แล้วใช้ logging levels ต่างๆ เพื่อบันทึกข้อความ
Logging levels มีดังนี้:
- debug
- info
- warn
- error
- fatal
ตัวอย่าง:
require 'logger' logger = Logger.new(STDOUT) logger.info 'testing...' logger.warn 'fun with Ruby :)'
ผลลัพธ์:
I, [2016-05-14T15:50:21.367590 #12148] INFO -- : testing... W, [2016-05-14T15:50:21.846651 #12148] WARN -- : fun with Ruby 🙂
ตัวอักษรแรกคือรูปย่อของ logging level (I = Info, W = Warn) ตามด้วย timestamp และ process id ปัจจุบัน (ได้จาก Process.pid ใน Ruby) สุดท้ายคือ logging level เต็มและข้อความจริง คุณสามารถเปลี่ยน format ได้โดยให้ formatter ใหม่
การทำงานกับ Prime Numbers
อาจไม่ต้องจัดการ prime numbers ทุกวัน แต่รู้ไว้ก็ดีนะ (โดยเฉพาะถ้าชอบ programming challenges) Ruby รองรับ prime numbers ได้ดีผ่าน class Prime
เมื่อ require Prime จะเพิ่มเมธอด prime? ให้ Fixnum
ตัวอย่าง:
require 'prime' 5.prime? # true 11.prime? # true 20.prime? # false
คลาสนี้ยังมี prime number generator:
ตัวอย่าง:
Prime.take(10) # [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
วิธีใช้ StringIO Class
StringIO class ให้คุณสร้าง string ที่พฤติกรรมเหมือน IO object หมายถึงคุณทำงานกับ string นี้ได้เหมือนอ่านจากไฟล์หรือ STDIN (Standard Input)
ตัวอย่าง:
require 'stringio' io = StringIO.new io << 'test' io << 'code' puts io.string # "testcode"
สังเกตจุดสำคัญ:
เมื่อเพิ่มข้อมูลเข้า StringIO object จะไม่เพิ่ม space หรือ newline ให้อัตโนมัติ และต้องเรียกเมธอด string เพื่อดึง string จริง ไม่สามารถใช้ array indexing เข้าถึงตัวอักษรแต่ละตัวได้เหมือน string ปกติ
เมื่อไหร่纔มีประโยชน์? บางครั้งอาจต้องแทนที่ไฟล์หรือ IO object อื่นด้วย object ที่ควบคุมง่ายกว่า เช่นใน testing environment สามารถแทนที่ STDOUT ด้วย StringIO object ได้ ดูตัวอย่างจริงจาก Rails: https://github.com/rails/rails/blob/52ce6ece8c8f74064bb64e0a0b1ddd83092718e1/activesupport/test/logger_test.rb
Encoding และ Decoding Base64
Base64 เป็น encoding format ที่พบบ่อยบนอินเทอร์เน็ต มัน长得像这样:
"cnVieQ=="
ทำไมถึงมีประโยชน์? URL มีชุดตัวอักษรที่จำกัด บางครั้งต้องการรวมตัวอักษรเหล่านั้น Base64 ทำให้เป็นไปได้
วิธี encode:
require 'base64'
Base64.encode64("ruby") # "cnVieQ=="
วิธี decode:
require 'base64'
Base64.decode64("cnVieQ==") # "ruby"
การทำงานกับ Paths
Pathname class wrap utilities สำหรับสำรวจ filesystem หลายอย่าง เช่น Dir และ File ใน class ที่ทรงพลังกว่า แม้ชื่อเมธอดจะเหมือนกัน แต่ return Pathname objects แทน strings หรือ arrays ซึ่งหมายถึงคุณสามารถทำงานต่อกับผลลัพธ์ด้วยเมธอด file-related ทั้งหมดได้
ตัวอย่างที่ยอดเยี่ยม:
require 'pathname'
Pathname.glob("*").count(&:directory?)
ถ้าทำด้วย Dir จะต้องเขียนแบบนี้ซึ่งไม่ขเลганต์เท่าไหร่:
Dir.glob("*").count { |d| File.directory?(d) }
ลองใช้ครั้งหน้าที่ต้องทำ file-system related task นะ 🙂
สรุป
หวังว่าตัวอย่างเหล่านี้จะมีประโยชน์! อย่าลืมสำรวจ Standard Library เพิ่มเติมเพื่อดูว่ามันทำอะไรให้คุณได้บ้าง
อย่าลืมแชร์บทความนี้ถ้าชอบ 🙂