Biểu tượng trong Ruby là gì?


45

Tôi hoàn toàn mới với thế giới Ruby và tôi hơi bối rối với khái niệm Biểu tượng. Sự khác biệt giữa Biểu tượng và Biến là gì? Tại sao không chỉ sử dụng các biến?

Cảm ơn.


trong Lisp - mà Ruby có nguồn gốc từ - một biểu tượng về cơ bản là kiểu dữ liệu cho một biến; điều đó có nghĩa là bạn có thể điều khiển chương trình theo kiểu Reflection-esque khi nó thực thi. (không phải là lời giải thích mạch lạc nhất, xin lỗi)
Paul Nathan

Câu trả lời:


70

Biến và biểu tượng là những thứ khác nhau. Một biến chỉ đến các loại dữ liệu khác nhau. Trong Ruby, một biểu tượng giống như một chuỗi hơn là một biến.

Trong Ruby, một chuỗi là có thể thay đổi, trong khi một biểu tượng là bất biến. Điều đó có nghĩa là chỉ cần tạo một bản sao của một biểu tượng. Vì vậy, nếu bạn có

x = :my_str
y = :my_str

:my_strsẽ chỉ được tạo một lần xytrỏ đến cùng một vùng bộ nhớ. Mặt khác, nếu bạn có

x = "my_str"
y = "my_str"

một chuỗi chứa my_strsẽ được tạo ra hai lần , và xysẽ trỏ đến các trường hợp khác nhau.

Do đó, các biểu tượng thường được sử dụng tương đương với enum trong Ruby, cũng như các khóa cho từ điển (hàm băm).


1
Chỉ cần đẩy quan điểm của @ mipadi, khi bạn so sánh một chuỗi, bạn cần so sánh mọi nhân vật với nhau. Vì vậy, so sánh các chuỗi giống hệt nhau là O (n). Trong khi các biểu tượng ruby ​​so sánh phù thủy tham chiếu đối tượng là O (1).
Jeremy Heiler

Tại sao Python không có cái này?
Công việc

Bạn nên cẩn thận để không lạm dụng chúng, vì, cuối cùng tôi đã biết, nhưng tôi đã không xem xét điều này trong ruby> 1.9, các biểu tượng không nhận được gc'd và vì vậy có thể ăn hết bộ nhớ
ếchstarr78

Họ cư xử giống hệt nhau trong Smalltalk, ngoại trừ họ trông như thế #mySymbol.
Frank Shearar

@ Frogstarr78 - Trừ khi bạn đang tạo các biểu tượng theo chương trình (thực hiện các chuỗi mà không kiểm tra chúng trước), bạn không phải lo lắng về việc tạo quá nhiều biểu tượng.
Justin L.

16

Biểu tượng trong Ruby về cơ bản giống như biểu tượng trong thế giới thực. Nó được sử dụng để đại diện hoặc đặt tên một cái gì đó.

Các biểu tượng thường được sử dụng để đại diện cho một số loại trạng thái, ví dụ

order.status = :canceled
order.status = :confirmed

Bạn cũng có thể xem biểu tượng như enum ngay lập tức. Bạn không cần xác định một biểu tượng, bạn chỉ cần sử dụng nó. Bài viết này giải thích nó rất chi tiết.


1
Giải thích tốt hơn hầu hết tôi dường như cho đến nay.
Yuri Ghensev

0

Thông thường, các biến có xu hướng bị nhầm lẫn với các chuỗi, nhưng tôi có thể hiểu bạn nghĩ nó giống như một biến. Việc nay co thể hiểu được. Nghĩ theo cách này:

Trạng thái của một người chơi trong trò chơi được thể hiện bằng một con số. 1 có nghĩa là còn sống, 2 có nghĩa là không chắc chắn, 3 có nghĩa là chết. Điều này có thể dễ dàng được thay thế bằng các biểu tượng. Các biểu tượng có thể :alive :unsure:dead. Để kiểm tra xem người chơi còn sống hay không, thay vì làm điều này:

if player_status == 1

Bạn có thể làm điều này:

if player_status == :alive

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.