2014-07-24 15 views
9

Tôi đang cố gắng hiểu sự khác biệt giữa biểu tượng và biến số trong ruby. Họ dường như làm điều tương tự trong việc đưa ra một cái tên tham chiếu đến một vật thể.Sự khác biệt giữa biểu tượng và biến trong Ruby là gì?

Tôi đã đọc các biểu tượng đó cho các chương trình nhanh hơn nhưng tôi không chắc chắn lý do tại sao hoặc chúng khác với các biến theo bất kỳ cách nào.

+0

Ngoài ra, hãy xem "[Toán tử kết nối trong Ruby là gì?] (Http://stackoverflow.com/questions/6337897/what-is-the-colon-operator-in-ruby)". –

Trả lời

11

Biểu tượng là chuỗi "được mã hóa", nó giống như một hằng số hơn bất kỳ thứ gì. Ví dụ điển hình:

account_details = { 
    :name => 'Bob', 
    :age => 20 
} 

đây những biểu tượng :name:age là chìa khóa cho một băm. Chúng không bị nhầm lẫn với các biến. account_details là một biến.

Một biến trong Ruby là một xử lý đối với một đối tượng nào đó, và đối tượng đó có thể là một biểu tượng.

Thông thường bạn sử dụng biểu tượng khi sử dụng chuỗi sẽ dẫn đến nhiều lần lặp lại. Hãy nhớ rằng các chuỗi thường là các đối tượng riêng biệt, nơi một biểu tượng riêng biệt luôn đề cập đến cùng một đối tượng, làm cho chúng hiệu quả hơn nếu được sử dụng thường xuyên.

Hãy so sánh:

"string".object_id == "string".object_id 
# => false 

:string.object_id == :string.object_id 
# => true 

Mặc dù hai chuỗi giống hệt nhau, họ là đối tượng chuỗi độc lập. Khi được sử dụng làm khóa cho băm, đối số cho phương thức và các trường hợp thông thường khác, những đối tượng này sẽ nhanh chóng làm lộn xộn bộ nhớ của bạn với số lượng lớn trùng lặp trừ khi bạn sử dụng cùng một cá thể chuỗi. Biểu tượng làm điều này cho bạn tự động.

+0

Cảm ơn bạn đã trả lời, tôi nghĩ rằng sự nhầm lẫn của tôi đến từ việc sử dụng Biểu tượng có Thuộc tính. Khi viết một trình đọc thuộc tính cho một biến mẫu, một biểu tượng được sử dụng trong thuộc tính, nhưng một biến được trả về. Biểu tượng liên quan đến biến cá thể trong trường hợp này như thế nào? – Cu1ture

+2

'attr_accessor: example' có nghĩa là" định nghĩa thuộc tính read/write có tên 'example' "và định nghĩa phương thức' example' và example = 'cũng như biến cá thể' @ example'. Đối số được truyền vào như một biểu tượng để phương thức nhận biết nó là gì. Hãy nhớ rằng các tên biến là cục bộ, tên của một biến không bao giờ được truyền vào. Ví dụ 'attr_reader' có nghĩa là" tạo một trình đọc với bất kỳ biến nào * ví dụ * muốn nó được gọi là ". Hàm 'attr_reader' không có cách nào để biết tên biến của bạn. Mối quan hệ ở đây là biểu tượng được sử dụng để truyền đạt tên mong muốn. – tadman

4

Chúng khá khác nhau. Các biến cho một nhãn cho một đối tượng. Biểu tượng giống như chuỗi, ngoại trừ việc chúng không thay đổi và được lưu trong bộ nhớ, do đó nhiều tham chiếu đến cùng một biểu tượng không sử dụng thêm bộ nhớ. (Tương phản với chuỗi này, trong đó nhiều tham chiếu đến cùng một chuỗi ký tự sẽ dẫn đến nhiều bản sao của chuỗi.)

+0

Tham chiếu chuỗi thông qua biến không làm điều tương tự và giữ một thể hiện trong bộ nhớ? Giống như sử dụng các biến trong JS để ngăn chặn trùng lặp và chỉ nhận được cùng một dữ liệu một lần. – Cameron

+0

@Cameron: Vâng, trong trường hợp của một cái gì đó như 'a =" string ", b = a', vâng. Trong trường hợp của 'a =" string "; b = "chuỗi" ', hai đối tượng có nội dung" chuỗi "sẽ được tạo. (Tôi không chắc chắn cách JS xử lý việc này.) – mipadi

5

Biến giữ tham chiếu đến một đối tượng. Ví dụ, các biến có thể tham khảo các chuỗi và biểu tượng như:

a = 'foo' 
b = :bar 

Trong Ruby chuỗi là có thể thay đổi, nó có nghĩa là bạn có thể thay đổi chúng: 'foo' + 'bar' sẽ cung cấp cho một chuỗi nối vào nhau. Bạn có thể nhận biết các ký hiệu là các chuỗi bất biến, điều đó có nghĩa là bạn không thể thay đổi một biểu tượng: :foo + :bar sẽ cho bạn một lỗi. Quan trọng nhất, các ký hiệu giống nhau giữ tham chiếu đến cùng một đối tượng:

a = :foo 
b = :foo 
a.object_id # => 538728 
b.object_id # => 538728 

Điều này làm tăng hiệu suất trong tra cứu băm và các hoạt động khác.

+1

Tôi muốn chỉ ra cho người đọc trong tương lai rằng có thể thêm hai đối tượng để có được một đối tượng khác không có nghĩa là đối tượng là có thể thay đổi. Các chuỗi trong Python và Lua là bất biến; thêm hai trong số họ cung cấp cho bạn một đối tượng khác. Trong Ruby, các chuỗi có thể thay đổi được, nhưng việc thêm hai trong số chúng không thay đổi một trong hai chuỗi cơ sở, nó cung cấp cho bạn một đối tượng chuỗi mới. – Taywee

Các vấn đề liên quan