Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

เชี่ยวชาญแฟล็กตัวแปลภาษา Ruby: วิธีใช้ตัวเลือกบรรทัดคำสั่งอย่างมีประสิทธิภาพ

ตัวแปลภาษา (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 แฟล็กทั้งหมดนี้อาจมีประโยชน์ ลองทดสอบดูสิ!

อย่าลืม แชร์บทความนี้ เพื่อให้คนอื่นได้ประโยชน์

ขอบคุณที่อ่าน 🙂