Trình thông dịch Ruby là chương trình đọc và chạy code Ruby.
Nhưng…
Bạn có biết trình thông dịch Ruby mặc định (MRI) có rất nhiều tùy chọn dòng lệnh thú vị và hữu ích?
Như:
ruby -v
Cho bạn phiên bản Ruby bạn đang dùng.
Hoặc cờ -e cho phép bạn chạy một đoạn code trực tiếp, không cần file và không cần vào irb.
Như sau:
ruby -e 'puts 123'
Bạn có thể tìm thấy các cờ này bằng cách dùng -h.
Có một số cờ "ẩn" bạn chỉ thấy với --help.
Dưới đây là bảng những gì tôi nghĩ là…
Các cờ thú vị nhất:
| Cờ | Mô tả |
|---|---|
| -v | In phiên bản Ruby |
| -c | Kiểm tra cú pháp |
| -e | Chạy code trực tiếp |
| -w | Bật cảnh báo |
| -r | Require file/gem |
| -I | Thêm thư mục vào load path |
| --enable frozen-string-literal | Đóng băng tất cả chuỗi |
| --dump parsetree | Hiển thị cây phân tích |
Hãy tập trung vào một số cờ này để xem chúng hoạt động như thế nào!
Kiểm tra cú pháp (Syntax Check)
Nếu bạn có code và muốn biết cú pháp có đúng không, bạn có thể dùng tùy chọn CLI -c.
Ví dụ:
ruby -c code_without_syntax_errors.rb # Syntax OK ruby -c code_with_syntax_errors.rb # syntax error, unexpected tIDENTIFIER, expecting end-of-input
Đơn giản, nhưng nó hoạt động 🙂
Require nhanh (Quick Require)
Đôi khi bạn muốn tạm thời require một gem vào chương trình Ruby mà không phải viết "require" ở đầu file.
Ví dụ như gem debug.
Ví dụ:
ruby -rpry code.rb
Rất hữu ích!
Cờ cảnh báo (The Warning Flag)
Sử dụng cờ cảnh báo sẽ bật linting và cho bạn thấy các vấn đề tiềm ẩn với code.
Ví dụ, code này:
p @test
Sẽ in cảnh báo sau khi bạn dùng ruby -w:
warning: instance variable @test not initialized
Đây là một cảnh báo tốt!
Bởi vì bạn có thể đang cố dùng biến instance mà chưa gán giá trị.
Hoặc bạn có thể có lỗi chính tả trong tên biến instance, cờ này giúp bạn tìm ra trước khi nó thành vấn đề.
Cách sửa đơn giản:
@test = nil
Dưới đây là ví dụ khác:
c = 1
Sẽ cho bạn:
warning: assigned but unused variable - c
Để sửa cảnh báo này, bạn có thể xóa biến hoặc dùng nó.
Điều này chỉ hoạt động cho biến cục bộ.
Nhưng bạn nên biết rằng bên trong đối số block, việc thay thế đối số không dùng bằng gạch dưới (_) được coi là "best practice".
Ví dụ:
{ chocolate: 82 }.map { |k, _| k }
Đây là quy ước phổ biến trong Ruby.
_ không đặc biệt, nó chỉ là một tên biến hợp lệ.
Thêm ví dụ về Cảnh báo
Kết quả của code sau không được trả về từ phương thức, cũng không được gán cho bất kỳ biến nào.
2 * 2
Ruby cảnh báo bạn như sau:
warning: possibly useless use of * in void context
Cách sửa?
Xóa câu lệnh vô dụng, hoặc gán nó cho biến.
Bây giờ hãy xem phương thức này:
def orange(weight, quantity) # ... end
Có nhiều cách gọi orange:
orange 100, 2 orange(100, 2) orange *[100, 2] orange(*[100, 2])
Nếu bạn dùng orange *[100, 2] với cảnh báo bật, bạn sẽ nhận được:
warning: '*' interpreted as argument prefix
Đang xảy ra gì?
Mơ hồ.
Ruby nghĩ bạn muốn nói orange * [100, 2], thay vì orange *[100, 2].
Khoảng trắng giữa * và [ tạo ra sự khác biệt vì nó liên kết * với mảng (toán tử splat) nếu thiếu, hoặc nghĩ * là gọi phương thức nếu có.
Vì vậy, trong trường hợp này, khoảng trắng quan trọng.
Bạn có thể sửa cảnh báo này bằng cách gọi phương thức bất kỳ cách khác.
Bây giờ:
Hãy chạy một số code của bạn với cờ -w và cải thiện nó bằng cách loại bỏ một số cảnh báo 🙂
Read-Eval-Print-Loop (REPL)
Bạn có thể quen với irb và pry, cả hai đều là những gì chúng ta gọi là REPL.
Dùng cờ -n kết hợp với cờ -e, bạn có thể đạt được hiệu quả tương tự với rất ít code.
Ví dụ:
echo 'bacon\nchocolate\norange' | ruby -ne 'puts $_.upcase' # BACON # CHOCOLATE # ORANGE
Điều này lấy input từ echo, sau đó với mỗi dòng nó gọi code của bạn (puts $_.upcase).
Ở đây $_ là biến đặc biệt chứa giá trị input cuối cùng được đọc bởi gets.
Cờ Frozen String Literals
Ruby 2.3 giới thiệu "magic comment" frozen string literals.
Trông như sau:
# frozen_string_literal: true
Điều này sẽ đóng băng tất cả chuỗi của bạn, làm cho chúng bất biến (không thể thay đổi).
Cách khác là truyền cờ --enable frozen-string-literal cho Ruby.
Code này:
str = "abcdef" str[0] = "b"
Sẽ cho lỗi sau khi bạn dùng cờ đó:
can't modify frozen String (FrozenError)
Nhưng nếu bạn cần thay đổi chuỗi?
Thì bạn có thể làm thế này:
str = "abcdef".dup
hoặc thế này:
str = +"abcdef"
Cả hai cho bạn chuỗi không bị đóng băng để làm việc.
Tóm tắt
Bạn đã học về các tùy chọn dòng lệnh của Ruby, bao gồm cờ phiên bản, cờ cảnh báo và frozen string literals. Tất cả các cờ này có thể hữu ích, hãy thử dùng chúng!
Đừng quên chia sẻ bài viết này để nhiều người hơn được hưởng lợi.
Cảm ơn bạn đã đọc 🙂