ตัวแปลภาษา (Interpreter) Ruby คือโปรแกรมที่อ่านและรันโค้ด Ruby
แต่...
คุณรู้ไหมว่า ตัวแปลภาษา Ruby เริ่มต้น (MRI) มีตัวเลือกบรรทัดคำสั่งที่น่าสนใจและมีประโยชน์เยอะมาก?
เช่น:
ruby -v
ซึ่งให้คุณเวอร์ชัน Ruby ที่คุณใช้อยู่
หรือแฟล็ก -e ซึ่งช่วยให้คุณรันโค้ดสั้นๆ ได้โดยตรง โดยไม่ต้องมีไฟล์ และไม่ต้องเข้า irb
เช่นนี้:
ruby -e 'puts 123'
คุณสามารถหาแฟล็กเหล่านี้ได้โดยใช้ -h
มีแฟล็ก "ซ่อน" บางตัวที่คุณเห็นได้ก็ต่อเมื่อใช้ --help
นี่คือตารางของสิ่งที่ผมคิดว่าเป็น...
แฟล็กที่น่าสนใจที่สุด:
| แฟล็ก | คำอธิบาย |
|---|---|
| -v | พิมพ์เวอร์ชัน Ruby |
| -c | ตรวจสอบไวยากรณ์ (Syntax check) |
| -e | รันโค้ดโดยตรง |
| -w | เปิดใช้งานคำเตือน (warnings) |
| -r | Require ไฟล์ / gem |
| -I | เพิ่มไดเรกทอรี่เข้า load path |
| --enable frozen-string-literal | แช่แข็งสตริงทั้งหมด |
| --dump parsetree | แสดง parse tree |
มาเน้นไปที่บางแฟล็กเพื่อดูว่ามันทำงานอย่างไร!
การตรวจสอบไวยากรณ์ (Syntax Check)
หากคุณมีโค้ดและต้องการทราบว่าไวยากรณ์ถูกต้องหรือไม่ คุณสามารถใช้ตัวเลือก CLI -c
ตัวอย่าง:
ruby -c code_without_syntax_errors.rb # Syntax OK ruby -c code_with_syntax_errors.rb # syntax error, unexpected tIDENTIFIER, expecting end-of-input
เรียบง่าย แต่มันทำงานได้ 🙂
Quick Require (Require ด่วน)
บางครั้งคุณต้องการ require gem เข้าโปรแกรม Ruby ชั่วคราว โดยไม่ต้องเขียน "require" บนสุดไฟล์
เช่น gem สำหรับดีบัก
ตัวอย่าง:
ruby -rpry code.rb
มีประโยชน์มาก!
แฟล็กคำเตือน (Warning Flag)
การใช้แฟล็กคำเตือนจะเปิดใช้งาน linting และแสดงปัญหาที่เป็นไปได้ของโค้ดคุณ
เช่น โค้ดนี้:
p @test
พิมพ์คำเตือนต่อไปนี้เมื่อคุณใช้ ruby -w:
warning: instance variable @test not initialized
นี่คือคำเตือนที่ดี!
เพราะคุณอาจพยายามใช้ตัวแปรอินสแตนซ์โดยไม่ได้กำหนดค่าให้มันก่อน
หรือคุณอาจมีข้อผิดพลาดพิมพ์ในชื่อตัวแปรอินสแตนซ์ ซึ่งแฟล็กนี้ช่วยให้คุณหาเจอก่อนที่จะกลายเป็นปัญหา
วิธีแก้ง่ายๆ:
@test = nil
อีกตัวอย่างหนึ่ง:
c = 1
จะให้คำเตือน:
warning: assigned but unused variable - c
เพื่อแก้คำเตือนนี้ คุณสามารถลบตัวแปรก็ได้ หรือใช้มัน
สิ่งนี้ทำงานได้กับ ตัวแปรกลาง (local variables) เท่านั้น
แต่คุณควรรู้ว่า ภายในอาร์กิวเมนต์ของบล็อก ถือเป็น "best practice" ที่จะแทนอาร์กิวเมนต์ที่ไม่ได้ใช้ด้วย underscore (_)
ตัวอย่าง:
{ chocolate: 82 }.map { |k, _| k }
นี่เป็นข้อตกลงทั่วไปใน Ruby
_ ไม่ได้พิเศษอะไร มันเพียงแค่เป็นชื่อตัวแปรที่ถูกต้อง
ตัวอย่างคำเตือนเพิ่มเติม
ผลลัพธ์ของโค้ดต่อไปนี้ไม่ได้ถูกคืนจากเมธอด หรือกำหนดให้ตัวแปรใดๆ
2 * 2
Ruby แจ้งเตือนแบบนี้:
warning: possibly useless use of * in void context
วิธีแก้?
ลบคำสั่งที่ไร้ประโยชน์ หรือกำหนดให้ตัวแปร
ตอนนี้มาดูเมธอดนี้:
def orange(weight, quantity) # ... end
มีวิธีเรียก orange หลายแบบ:
orange 100, 2 orange(100, 2) orange *[100, 2] orange(*[100, 2])
หากคุณใช้ orange *[100, 2] พร้อมเปิดคำเตือน จะได้:
warning: '*' interpreted as argument prefix
เกิดอะไรขึ้น?
ความคลุมเครือ (Ambiguity)
Ruby คิดว่าคุณหมายถึง orange * [100, 2] แทนที่จะเป็น orange *[100, 2]
ช่องว่างระหว่าง * และ [ ทำให้ต่างกัน เพราะมันเชื่อมโยง * กับอาร์เรย์ (splat operator) ถ้าไม่มีช่องว่าง หรือคิดว่า * เป็นการเรียกเมธอด ถ้ามีช่องว่าง
ใช่แล้ว ในกรณีนี้ ช่องว่างสำคัญ
คุณสามารถแก้คำเตือนนี้ได้โดยการเรียกเมธอดแบบอื่นๆ
ตอนนี้:
ลองรันโค้ดของคุณเองกับแฟล็ก -w และปรับปรุงมันโดยการกำจัดคำเตือนบางส่วน 🙂
Read-Eval-Print-Loop (REPL)
คุณน่าจะคุ้นเคยกับ irb และ pry พวกมันคือสิ่งที่เราเรียกว่า REPLs
การใช้แฟล็ก -n ร่วมกับ -e ช่วยให้คุณได้เอฟเฟกต์คล้ายกันด้วยโค้ดน้อยมาก
ตัวอย่าง:
echo 'bacon\nchocolate\norange' | ruby -ne 'puts $_.upcase' # BACON # CHOCOLATE # ORANGE
นี่รับอินพุตจาก echo แล้วสำหรับแต่ละบรรทัด เรียกโค้ดของคุณ (puts $_.upcase)
ที่ $_ เป็นตัวแปรพิเศษที่เก็บค่าอินพุทล่าสุดที่อ่านโดย gets
แฟล็ก Frozen String Literals
Ruby 2.3 นำเสนอ "magic comment" สำหรับ frozen string literals
มันเป็นแบบนี้:
# frozen_string_literal: true
สิ่งนี้จะ แช่แข็งสตริงทั้งหมดของคุณ ทำให้มัน immutable (เปลี่ยนไม่ได้)
อีกวิธีหนึ่งคือส่งแฟล็ก --enable frozen-string-literal ให้ Ruby
โค้ดนี้:
str = "abcdef" str[0] = "b"
จะเกิดข้อผิดพลาดนี้เมื่อใช้แฟล็กนั้น:
can't modify frozen String (FrozenError)
แต่ถ้าคุณต้องการเปลี่ยนสตริง?
คุณสามารถทำได้:
str = "abcdef".dup
หรือแบบนี้:
str = +"abcdef"
ทั้งคู่ให้คุณสตริงที่ไม่ถูกแช่แข็งมาใช้งาน
สรุป
คุณได้เรียนรู้เกี่ยวกับตัวเลือกบรรทัดคำสั่งของ Ruby รวมถึงแฟล็กเวอร์ชัน แฟล็กคำเตือน และ frozen string literals แฟล็กทั้งหมดนี้อาจมีประโยชน์ ลองทดสอบดูสิ!
อย่าลืม แชร์บทความนี้ เพื่อให้คนอื่นได้ประโยชน์
ขอบคุณที่อ่าน 🙂