2010-05-10 44 views
5

Tôi mới vào thế giới Ruby và Ruby on Rails. Tôi đã đọc một số hướng dẫn, nhưng tôi đã gặp một số rắc rối với cú pháp sau. Tôi nghĩ rằng việc sử dụng :condition cú pháp được sử dụng trong Ruby để xác định một thuộc tính lớp với một số loại accessor, như:Điều gì: điều này có nghĩa trong Ruby on Rails?

class Sample 
    attr_accessor :condition 
end 

rằng mặc nhiên tuyên bố getter và setter cho các "điều kiện" bất động sản. Trong khi tôi đang xem xét một số mã mẫu Rails, tôi đã tìm thấy các ví dụ sau mà tôi không hiểu đầy đủ.

Ví dụ:

@post = Post.find(params[:id]) 

Tại sao nó truy cập vào thuộc tính id với cú pháp này, thay vì:

@post = Post.find(params[id]) 


Hoặc, ví dụ:

@posts = Post.find(:all) 

:all một hằng số ở đây? Nếu không, mã này thực sự có ý nghĩa gì? Nếu có, tại sao sau không được sử dụng:

@posts = Post.find(ALL) 

Cảm ơn

Trả lời

10

Một thư đại tràng trước khi văn bản chỉ ra một biểu tượng trong Ruby. Một biểu tượng giống như một hằng số, nhưng nó gần như là một biểu tượng nhận được một giá trị duy nhất (mà bạn không quan tâm) là giá trị không đổi của nó.

Khi được sử dụng làm chỉ mục băm, các ký hiệu gần như (nhưng không chính xác) giống như sử dụng chuỗi.

Ngoài ra, bạn có thể đọc "tất cả" từ :all bằng cách gọi to_s trên biểu tượng. Nếu bạn có biến số không đổi ALL, sẽ không có cách nào để xác định rằng nó có nghĩa là "tất cả" ngoài việc tìm kiếm giá trị của nó. Đây cũng là lý do tại sao bạn có thể sử dụng biểu tượng làm đối số cho các phương thức meta như attr_accessor, attr_reader và các loại tương tự.

Bạn có thể muốn read up on Ruby symbols.

+0

Vì vậy, có vẻ như với tôi rằng một biểu tượng có vẻ giống như một giá trị Enum trong Java hoặc C#, phải không? – Mark

+0

@Marco: Không, các ký hiệu trong Ruby không có gì giống như các giá trị enum. Chúng giống như các biểu tượng trong Lisp hoặc các ký hiệu trong Smalltalk. –

+0

OK, cảm ơn! – Mark

0

Điều này không liên quan gì đến Rails, chỉ là số Symbols của Ruby. :all là một biểu tượng có hiệu quả chỉ là một chuỗi cơ bản.

1

:all là một biểu tượng. Biểu tượng là phiên bản của Ruby interned strings. Bạn có thể nghĩ về nó như thế này: Có một bảng toàn cục vô hình được gọi là symbols có các khóa StringFixnum. Bất kỳ chuỗi nào cũng có thể được chuyển đổi thành một biểu tượng bằng cách gọi .to_sym, tìm kiếm chuỗi trong bảng. Nếu chuỗi đã có trong bảng, nó trả về bảng Fixnum, nếu không, nó sẽ nhập nó vào bảng và trả về lần tiếp theo là Fixnum. Bởi vì điều này, các biểu tượng được điều trị tại thời gian chạy như Fixnums: thời gian so sánh là không đổi (trong C cách nói, so sánh các biểu tượng có thể được thực hiện với == thay vì strcmp)

Bạn có thể xác minh điều này bằng cách nhìn vào object_id của các đối tượng ; khi object_ids của hai thứ giống nhau, cả hai đều trỏ vào cùng một đối tượng.

Bạn có thể thấy rằng bạn có thể chuyển đổi hai chuỗi để biểu tượng, và cả hai đều sẽ có cùng một đối tượng id:

"all".to_sym.object_id == "all".to_sym.object_id #=> true

"all".to_sym.object_id == :all.object_id #=> true

Nhưng ngược lại là không đúng: (mỗi cuộc gọi đến Symbol # to_s sẽ tạo ra một chuỗi hoàn toàn mới)

:all.to_s.object_id == :all.to_s.object_id #=> false

1

Đừng nhìn vào biểu tượng như một cách để tiết kiệm bộ nhớ. Nhìn vào họ như chỉ ra rằng chuỗi nên được bất biến. 13 Ways of Looking at a Ruby Symbol cung cấp nhiều cách để xem biểu tượng.

Để sử dụng ẩn dụ: biểu tượng dành cho các bài kiểm tra trắc nghiệm, các chuỗi dành cho các câu hỏi tiểu luận.

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