Magic Comments in Ruby



Trong bài viết này, chúng ta sẽ khám phá các chủ đề sau:

  • Comments và magic comments
  • Specifications
  • Các magic comments hiện có

Comments vs. Magic Comments

Trong Ruby, bạn có thể chú thích và ghi lại mã của mình bằng các comments.

To declare a we use the # character followed by our comment

Để khai báo một comment, chúng ta sử dụng ký tự # theo sau là nhận xét của chúng ta.

# Polylithic linked list structure
class LinkedList
end

Ở đây, tất cả các văn bản sau # không được Ruby diễn giải. Nó chỉ giúp nhà phát triển hiểu code.

Mặt khác, có một số comments được diễn giảibởi Ruby. Chúng được gọi là Magic Comments , hoặc magic instructions.

# encoding: big5

''.encoding # => #<Encoding:Big5>

Ở đây, # encoding: big5 được diễn giải bởi Ruby.

Khi Ruby đọc magic comment này, nó sẽ tự động đặt 1 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.

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

Có hai cú pháp để khai báo một bình luận kỳ diệu:

# encoding: UTF-8
# -*- encoding: UTF-8 -*-

Cả hai cú pháp sẽ được giải thích tương tự bởi Ruby.

Nhiều file

Hãy cùng xem phạm vi scope của một magic comment.

# encoding: big5

''.encoding # => #<Encoding:Big5>

require './world.rb'
''.encoding # => #<Encoding:UTF-8>

Như chúng ta có thể thấy, magic commen chỉ có hiệu lực trong file được khai báo. Thật vậy, mã hóa trong tệp 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 file cần thiết.

Nhiều magic comments

Chúng ta có thể khởi tạo nhiều magic comments trong cùng một file

Ví dụ:.

# encoding: big5
# frozen_string_literal: true

Tại đây, Ruby sẽ phân tích và xử lý cả hai magic comments - chúng ta sẽ đi sâu vào chi tiết về những magic comments này trong phần tiếp theo.

Vì vậy, cả hai dòng đều có hiệu quả trong file này.

Thứ tự ưu tiên

Vì các quy tắc ưu tiên là khác nhau đối với mỗi magic comment, Tôi 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 về các magic comment, hãy xem xét các bình luận ma thuật khác nhau mà chúng ta có thể sử dụng cùng với nhau.

Magic Comments

Trong phần này, chúng tôi sẽ nói về từng magic comment. Chúng ta đ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 comment và đưa ra cho bạn những quy tắc ưu tiên được áp dụng cho chúng. Bạn cần xem tài liệu chính thức để biết thêm thông tin, v.v.

encoding: magic comment

Trong Ruby, mã hóa mặc định cho bất kỳ chuỗi ký tự nào là UTF-8.

Hãy đọc The Evolution of Ruby Strings from 1.8 to 2.5 nếu bạn không quen thuộc với khái niệm về codepointencoding.

encoding: magic comment cho phép chúng ta sửa đổi mã hóa mặc định trong file nơi có comment này.

# encoding: big5

''.encoding # => #<Encoding:Big5>

Chúng ta có thể thấy rằng mã hóa chuỗi của chúng ta là Encoding:Big5 - như được khai báo trong magic comment. Thứ tự ưu tiên

# encoding: big5
# encoding: iso-8859-2
# coding: binary

''.encoding # => #<Encoding:Big5>

Ở đây, chỉ có comment encoding: khai báo đầu tiên được xử lý. Những dòng khác được bỏ qua. Lưu ý rằng chúng ta có thể sử dụng encoding: hoặc coding:.

Một loại khác cũng rất quen thuộc: frozen_string_literal:

magic comment này khá hữu ích khi bạn khai báo một chuỗi tương tự nhiều lần bằng cách sử dụng chuỗi ký tự.

Thật vậy, 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, trong ruby có một khái niệm tương tự là symbol.

# 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 khai báo hai chuỗi tương tự nhau, chỉ một instance của lớp String sẽ được tạo cho cả hai chuỗi. Cơ chế này đặc biệt hữu ích khi chúng ta sử dụng các chuỗi làm định danh cho các resources, tương tự như một symbol. Thứ tự ưu tiên

# frozen_string_literal: false
# frozen_string_literal: true

p 'key'.object_id # => 70306598556120
p 'key'.object_id # => 70306598556120

Ở đây, chỉ có lệnh được khai báo frozen_string_literal: cuối cùng được xử lý . Những cái khác được bỏ qua.

warn_indent: magic comment

Comment này hoạt động tương tự như đầu ra dòng lệnh ruby -w warn_indent.rb.

# warn_indent: true

def h
  end # bad indentation
$> ruby warn_indent.rb
warn_indent.rb:4: warn: mismatched indentations at 'end' with 'def'

Ở đây, chúng ta có thể thấy rằng nếu code không được thụt lề tốt, Ruby sẽ đưa ra cảnh báo tương ứng. Thứ tự ưu tiên Ở đây, chỉ có lệnh warn_indent: cuối cùng được xử lý. Những cái khác bị sẽ bị bỏ qua.