Computer >> Máy Tính >  >> Lập trình >> Ruby

Các biểu tượng Ruby là gì và chúng hoạt động như thế nào?

Biểu tượng trông như thế này:

:testing

Một số người nhầm lẫn các ký hiệu với các biến, nhưng chúng không liên quan gì đến các biến…

một biểu tượng giống như một chuỗi ký tự .

Vậy sự khác biệt giữa các ký hiệu và chuỗi Ruby là gì?

Các chuỗi được sử dụng để làm việc với dữ liệu .

Các ký hiệu là số nhận dạng .

Đó là sự khác biệt chính:

Các biểu tượng không chỉ là một loại chuỗi ký tự khác, chúng có một mục đích khác.

Khi nào sử dụng các ký hiệu

Một trong những cách sử dụng phổ biến nhất cho các ký hiệu là đại diện cho tên biến phương thức &phiên bản .

Ví dụ :

attr_reader :title

:title sau attr_reader là một ký hiệu đại diện cho @title biến phiên bản.

Bạn cũng có thể sử dụng các ký hiệu làm khóa băm.

Ví dụ :

hash = {a: 1, b: 2, c: 3}

Những lợi ích?

Các ký hiệu trông đẹp hơn, chúng không thay đổi và nếu bạn đánh giá các khóa chuỗi so với các khóa ký hiệu, bạn sẽ thấy rằng các khóa chuỗi chậm hơn khoảng 1,70 lần.

Bởi bất biến, tôi có nghĩa là mọi biểu tượng là duy nhất và không thể thay đổi được:

:rubyguides.object_id
# 437768

:rubyguides.object_id
# 437768

Hai biểu tượng này cùng một đối tượng vì chúng có cùng id đối tượng.

Các ký hiệu có thể được sử dụng trong các phương pháp lập trình siêu mẫu như send :

[1,2,3].send(:first)

Tóm tắt :

Bạn nên sử dụng các ký hiệu làm tên hoặc nhãn cho những thứ (như phương thức) và sử dụng chuỗi khi bạn quan tâm hơn về dữ liệu (các ký tự riêng lẻ).

Chuyển đổi giữa các chuỗi &ký hiệu

Bạn có thể chuyển đổi một biểu tượng thành một chuỗi khi cần thiết.

Tại sao bạn muốn làm điều đó?

Bởi vì các biểu tượng chỉ có một tập hợp con của các phương thức mà một Chuỗi có.

Và không thể thay đổi các ký hiệu, vì vậy nếu bạn muốn làm việc với các ký tự riêng lẻ của ký hiệu thì bạn cần một chuỗi.

Bạn có thể thực hiện việc này bằng cách sử dụng to_s phương pháp.

Ví dụ:khi sử dụng method_missing bạn nhận được tên của phương thức bị thiếu làm ký hiệu. Bạn có thể muốn kiểm tra xem tên phương thức này có khớp với một mẫu nhất định hay không (như kết thúc bằng ? ).

Ví dụ :

def method_missing(method_name, *args, &block)
  if method_name.to_s[-1] == "?"
    # do something
  else
    super
  end
end

Bạn cũng có thể chuyển đổi một đối tượng chuỗi thành một đối tượng biểu tượng.

Phương pháp để thực hiện việc này là String#to_sym :

"rubyguides".to_sym

:rubyguides

Tạo một mảng ký hiệu

Nếu bạn muốn tạo một mảng ký hiệu, bạn có thể sử dụng mã này:

symbols = %i(a b c)

[:a, :b, :c]

Điều này giúp bạn không phải nhập dấu hai chấm và dấu phẩy.

Tương tự với phiên bản chuỗi %w :

strings = %w(a b c)

["a", "b", "c"]

Video biểu tượng Ruby

Biểu tượng GC (Nâng cao)

Một sự thật thú vị khác về các biểu tượng là có nhiều loại khác nhau.

Lý do là các biểu tượng không được thu thập rác trước Ruby 2.2, có nghĩa là chúng không được dọn dẹp khỏi bộ nhớ khi không còn cần thiết như các đối tượng Ruby thông thường (chuỗi, băm, mảng…).

Bạn có thể xem ví dụ ở đây :

p Symbol.all_symbols.size
# 2443

('aa'..'aj').map(&:to_sym)

GC.start
p Symbol.all_symbols.size
# 2453

Bạn sẽ nhận thấy rằng tổng số biểu tượng tăng lên 10, giống như bạn mong đợi vì chúng tôi đang tạo 10 biểu tượng mới.

Nhưng vì Ruby 2.2, các ký hiệu này bị xóa khỏi bộ nhớ vì chúng chỉ là tạm thời và không được sử dụng bởi thứ khác trong mã này.

Nếu bạn thử mã này trên phiên bản Ruby có bật Symbol GC thì cả hai số lượng ký hiệu sẽ giống nhau.

Một số biểu tượng sẽ không bao giờ bị xóa khỏi bộ nhớ, chúng được gọi là "biểu tượng bất tử".

Bạn có thể đếm chúng bằng mô-đun ObjectSpace:

require 'objspace'

ObjectSpace.count_symbols

{
  :mortal_dynamic_symbol=>3,
  :immortal_dynamic_symbol=>5,
  :immortal_static_symbol=>3663,
  :immortal_symbol=>3668
}

Lưu ý rằng các ký hiệu được tạo trực tiếp, như :a1 sẽ tự động trở thành những biểu tượng bất tử. Tạo một phương thức mới cũng sẽ tạo một immortal_static_symbol đi cùng với nó.

Vậy các biểu tượng phàm trần đến từ đâu?

Từ các chuỗi được chuyển đổi thành các ký hiệu với to_sym phương pháp.

Bạn có thể tự kiểm tra điều này bằng cách sử dụng ObjectSpace.count_symbols .

Và nếu bạn đang thắc mắc immortal_dynamic_symbol là gì , đó là một biểu tượng đã được thăng cấp từ phàm trần thành bất tử. Điều này có thể xảy ra khi bạn tạo một phương thức với tên của một biểu tượng phàm trần.

Tóm tắt

Qua bài viết này, bạn đã học được:

  • Các biểu tượng là bất biến
  • Các biểu tượng không phải là con trỏ đến các giá trị, chúng là các giá trị tự thân
  • Các chuỗi dành cho dữ liệu và các ký hiệu là để nhận dạng
  • Cách chuyển đổi giữa các chuỗi và ký hiệu
  • Symbol GC đã được giới thiệu trong Ruby 2.2 để xóa các ký hiệu tạm thời

Hy vọng bạn đã học được điều gì đó mới!

Hãy chia sẻ bài đăng này để nó có thể đến được với nhiều người hơn 🙂