Magic Comments in Ruby
Bài đăng này đã không được cập nhật trong 5 năm
1. Giới thiệu
Trong bài này, chúng ta sẽ tìm hiểu về những topic sau:
- Comments vs .magic comments
- Specifications
- Existing magic comments
2. Comments vs Magic Comments
2.1. Comments
Comment trong Ruby code là những ghi chú và chú thích để lập trình viên đọc hiểu code dễ dàng hơn. Để tạo một comment chúng ta sử dụng dấu "#" trước mỗi comment của mình.
# This is a comment
Ở đây, tất cả đoạn được viết sau dấu "#" thì không được biên dịch bởi Ruby. Nó chỉ hữu ích cho lập trình viên hiểu đoạn code hơn.
Có một cách nữa để comment nhiều dòng như sau:
=begin This is a comment... a b c =end
Mặt khác, có một số comment được chú thích bởi Ruby. Chúng được biết như những magic comments, hay magic instructions.
2.2. Magic comments
# encoding: big5
''.encoding # => #<Encoding:Big5>
Ở đây, #encoding: big5 là chú thích bởi Ruby.
Khi Ruby đọc magic comment này, nó sẽ tự động đặt mã hóa của bất kỳ chuỗi nào được khai báo trong file này thành Encoding:Big5
. Chúng ta sẽ đi sâu hơn vào encoding:
trong phần cuối của bài viết này.
Bây giờ chúng ta biết sự khác nhau giữa một comment và một magic comment rồi. Bây giờ chúng ta hãy đi vào tìm hiểu chi tiết về magic comment nhé.
2.2.1. Specifications
Chúng ta hãy xem các quy tắc ngầm mà chúng ta cần biết để tận dụng tốt nhất tính năng này.
Cú pháp Đây là hai cú pháp để khai báo một magic comment:
# encoding: UTF-8
# -*- encoding: UTF-8 -*-
Cả hai cú pháp sẽ được giải thích tương tự bởi ruby
Multiple files Đây là 2 cú pháp để khai báo magic comments trong cùng một file.
# encoding: big5
''.encoding # => #<Encoding:Big5>
require './world.rb'
File world.rb
''.encoding # => #<Encoding:UTF-8>
Như chúng ta thấy, magic comment chỉ có hiệu lực trong tập tin được khai báo. Thật vậy, encoding trong file world.rb là mã hóa mặc định của Ruby: encoding: UTF-8
Vì vậy, magic comment không có tác động đến các tập tin cần thiết.
Multiple magic comments Chúng ta có thể khai báo nhiều magic comments trong cùng một file. Ví dụ:
# encoding: big5
# frozen_string_literal: true
Ở đây, Ruby sẽ phân tích và xử lý cả 2 magic comments, chúng ta sẽ đi sâu và chi tiết của những magic comments trong phần tiếp theo. Vì vậy, cả hai đều có hiệu quả trong file này.
Precedence
Vì các quy tắc ưu tiên là khác nhau đổi với mỗi magic comment, Mình sẽ mô tả các quy tắc này dưới mỗi magic comment.
Bây giờ chúng ta đã quen thuộc hơn với khái niệm magic comment, hãy xem xét các bình luận khác nhau dưới đây.
2.2.2 Magic comments
Trong bài viết này, chúng ta sẽ nói về từng magic comments. Chúng ta sẽ đi sâu vào từng khái niệm. Mục tiêu ở đây là trình bày cho bạn những magic comments và đưa ra những quy tắc ưu tiên được áp dụng cho chúng.
The encoding: magic comment
Trong Ruby, mã hóa mặc điịnh cho bất kỳ chuỗi nào là UTF-8.
Bạn có thể tham khảo nếu bạn chưa quen với khái niệm về codepoint và encoding The Evolution of Ruby Strings from 1.8 to 2.5
The encoding: magic comment cho phép chúng ta sửa đổi mã hóa mặc định này trong file nơi mà comment này được định nghĩa.
# encoding: big5
''.encoding # => #<Encoding:Big5>
Chúng ta có thể thấy chuỗi encoding là Encoding:Big5 - như khai báo trong magic comment.
Độ ưu tiên
# encoding: big5
# encoding: iso-8859-2
# coding: binary
''.encoding # => #<Encoding:Big5>
Ở đây, chỉ khái báo đầu tiên encoding:
hướng dẫn được xử lý. Những cái khác bỏ qua.
Note: Chúng ta có thể sử dụng encoding:
hoặc coding:
.
The frozen_string_literal: magic comment
Magic comment này khá hữu dụng khi bạn định nghĩa một chuỗi tương tự nhiều lần bằng cách sử dụng chuỗi ký tự.
Nó thực hiện tối ưu hóa bằng cách chỉ tạo một đối tượng trên mỗi chuỗi, dựa trên nội dung.
# frozen_string_literal: true
p 'key'.object_id # => 70306598556120
p 'key'.object_id # => 70306598556120
Ở đây, chúng ta có thể thấy rằng nếu chúng ta định nghĩa 2 chuỗi giống nhau, chỉ một thể hiện của lớp String sẽ được tạo ra cho cả hai. Cơ chế này đặc biệt hữu ích khi chúng ta sử dụng các chuỗi như những định danh cho tài nguyên, tương tự như một symbol.
Độ ưu tiên:
# frozen_string_literal: false
# frozen_string_literal: true
p 'key'.object_id # => 70306598556120
p 'key'.object_id # => 70306598556120
Ở đây, chỉ khai báo cuối cùng frozen_string_literal: instruction is processed. Những cái khác bỏ qua.
The warn_indent: magic comment
Comment này làm việc giống như một ruby -w warn_indent.rb
đầu ra dòng lệnh.
# warn_indent: true
def h
end # bad indentation
Ở đây, chúng ta có thể thấy rằng nếu code cũng không được thụt lề, Ruby đưa ra một cảnh báo phù hợp.
Độ ưu tiên:
# warn_indent: false
# warn_indent: true
def h
end # bad indentation
Ở đây, chỉ khai báo cuối warn_indent: instruction is processed. Những cái khác bỏ qua.
Trên đây là một số cú pháp về comment và magic comment. Hy vọng sẽ giúp ích cho các bạn.
Link tham khảo: https://medium.com/rubycademy/magic-comments-in-ruby-81d45ff92e34
All rights reserved