2009-04-09 27 views
53

Đây là một cái gì đó đã được bugging cho tôi một thời gian. Khi tôi nhìn thấy bất kỳ phương pháp của Ruby in bằng văn bản, nó thường xuất hiện như:Tại sao các phương thức trong tài liệu Ruby trước bằng một dấu băm?

Class#method 

hoặc

#method 

Bây giờ, tôi sẽ sử dụng:

Class.method 

Tại sao tất cả các phương pháp của Ruby trước bởi một dấu thăng? Có lý do nào cho nó không? Chỉ tò mò thôi.

+0

Khi nào ngày trở lại? – nafg

Trả lời

14

Từ rdoc docs:

Tên của các lớp học, các file nguồn, và bất kỳ tên phương pháp có chứa một gạch dưới hoặc trước bởi một băm nhân vật sẽ được tự động siêu liên kết từ văn bản bình luận cho họ mô tả.

(Nhấn mạnh thêm.)

95

Lưu ý rằng quy ước là:

Class#method 

hơn

object#method 

Trong mã bạn sẽ phải object.method, nếu object là một thể hiện của class. Công ước # không được sử dụng trong mã.

Từ the RDoc documentation:

Sử dụng :: để mô tả phương pháp lớp, # để mô tả phương pháp dụ, và sử dụng. ví dụ mã.

+0

Có, xin lỗi, Phương pháp lớp #. Cảm ơn. –

+1

Tôi biết rằng # không được sử dụng trong mã, nhưng tại sao nó được sử dụng ở tất cả? –

+0

Liên kết dường như đã bị rỉ nhưng đủ để được báo cho tôi tìm nguồn hiện tại: http://ruby-doc.org/documentation-guidelines.html –

7

Tất cả các câu trả lời ở trên, bạn liệt kê là chính xác. Một trong những điều tôi muốn nói thêm là theo phong cách tài liệu bạn nói bạn sẽ perfer

Class.method

sẽ dễ dàng bị nhầm lẫn với các phương pháp lớp. Vì bạn có thể gọi các phương thức lớp trong ruby ​​sử dụng cú pháp trên:

class Foo 
    def self.say_hi 
    puts "hi" 
    end 
end 

Foo.say_hi # => prints "hi" 
27

CáC# ký hiệu được sử dụng để tham khảo các phương pháp kinh điển instance, như String#upcase. Các . ký hiệu được sử dụng để chỉ phương pháp của một cá thể cụ thể, như mystring.upcase. Sự khác biệt được tạo ra để không ngụ ý rằng một phương thức lớp 'upcase' tồn tại.

17

Tôi vừa nhận ra rằng không có câu trả lời nào khác chạm vào khía cạnh nhỏ nhất của câu hỏi: tại sao ký hiệu #?

Tôi có hai giả thuyết:

  1. Nó có thể đến từ Smalltalk, nơi biểu tượng được viết #sym (thay vì :sym) như họ đang có trong Ruby. Vì vậy, nếu bạn muốn tham khảo đến một phương pháp đối tượng (như trái ngược với gọi một phương pháp), sau đó bạn sẽ gọi một cái gì đó giống như Array >> #new. (The >> thân nó là một phương thức trả về phương pháp truyền cho nó. Vì vậy, Trong tài liệu đó có thể là Array.method :new.) Trong tài liệu Smalltalk, các phương thức thường được gọi là Class>>method, nhưng trong Ruby Class:method sẽ có ý nghĩa hơn, ngoại trừ việc nó dễ bị nhầm lẫn với Class::method. Do đó, Class#method đã được chọn.
  2. Lý thuyết khác của tôi là nó đơn giản được chọn vì # là ký tự nhận xét trong Ruby.

Câu trả lời cuối cùng chỉ có thể được đưa ra bởi bất kỳ ai phát minh ra quy ước đó. Nếu nó được phát minh cho cuốn sách Lập trình Ruby, đó sẽ là Dave Thomas hoặc Andy Hunt, nhưng tôi không chắc chắn điều đó. Cuốn sách xuất hiện vào năm 2001, Ruby bắt đầu vào năm 1993, trước đây họ đã đề cập đến phương pháp như thế nào?

+1

Tôi đã nghe nói rằng các lập trình viên thực dụng cũng đã tạo tài liệu cho Ruby (họ muốn tạo tài liệu để những người khác bị "lừa" thêm vào nó). git có thể đưa bạn trở lại năm 1998, vì vậy bạn có thể kiểm tra nếu 'Class # method_name' đã xảy ra trước khi các progs prag thêm nó. –

+0

Tôi đã nghe nói rằng tài liệu đã tồn tại trước khi các progs prag bắt đầu thêm nó vào mã nguồn. –

+1

Có lẽ nó bắt chước giao diện của cú pháp # anchor trong HTML. Ví dụ: http://www.somesite.com/somepage#section. – BHS

3

Điều này đã được đề cập trong JS version of this question, nhưng có vẻ như khả năng danh pháp này came from JavaDoc trong đó dấu băm được dịch trực tiếp thành tham chiếu trên trang, ví dụ: href="Component.html#getComponentAt(int, int)"

+0

Huh, tôi đã tự hỏi tại sao Javadoc yêu cầu sử dụng đó, nhưng tôi đã không ngờ rằng lý do này lại quá tầm thường. – JAB

1

câu trả lời của heff (mà tôi không thể nhận xét do thiếu danh tiếng), Ruby theo ví dụ của JavaDoc, là dự đoán tốt nhất trong quan điểm của tôi. Các nhà thiết kế JavaDoc cần hoặc muốn một cách để phân biệt các vòng loại gói (mà họ đã sử dụng dấu chấm cho) từ các vòng loại lớp (mà họ đã sử dụng hàm băm cho). @see và thẻ @link cú pháp javadoc của trông như thế này:

@see package.class#member [optional label] 
{@link package.class#member [optional label]} 

Xem tài liệu của JavaDoc's package.class variant of the @see tag và tài liệu của thẻ @link javadoc, mà heff đã chỉ ra.

Trong JavaDoc, tên gói thường có thể được bỏ qua, vì vậy chỉ phần Class # vẫn còn, trông có vẻ lạ như trong Ruby, vì mã Java sử dụng cú pháp Class.member, giống như Ruby. Nó sẽ là thú vị để tìm hiểu lý do tại sao các nhà thiết kế JavaDoc cần cú pháp khác nhau, trong khi trình biên dịch Java thực hiện tốt với các dấu chấm cho cả hai mục đích. Điều này có thể là điều thú vị.

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