2010-06-26 20 views
8

Ví dụ: tôi luôn thấy các phương pháp được gọi là String#split, nhưng không bao giờ String.split, có vẻ hợp lý hơn một chút. Hoặc thậm chí có thể là String::split, vì bạn có thể xem xét #split để ở trong không gian tên là String. Tôi thậm chí đã nhìn thấy phương pháp một mình, khi lớp được giả định/ngụ ý (#split).Lý do/lịch sử cho quy ướC# về cách xác định các phương thức trong Ruby là gì?

Tôi hiểu rằng đây là phương pháp được xác định bằng ri. Cái nào đến trước?

Điều này có khác biệt không, ví dụ: phương pháp từ trường? Tôi cũng đã nghe nói rằng điều này giúp phân biệt các phương thức thể hiện từ các phương thức lớp. Nhưng điều này đã bắt đầu từ đâu?

+0

Tôi muốn biết tại sao quy ước này không được đề cập/giải thích trong sách/hướng dẫn khi thảo luận về các quy ước đặt tên của Ruby. Tôi thấy khó hiểu khi thấy tên phương thức với tiền tố '#' trong các cuộc thảo luận khác nhau và chỉ có thể đoán được tiền tố có ý nghĩa gì. Thực tế là '#' bắt đầu một chú thích trong .rb làm cho nó gây nhầm lẫn gấp đôi. Như bạn có thể tưởng tượng, nó không phải là điều dễ dàng nhất để tìm kiếm, vì vậy cảm ơn vì đã hỏi điều này một nơi nào đó tôi đã có thể vấp ngã trên đó. Tôi tự hỏi liệu tôi có thể tìm lại nó khi tôi quên những chi tiết này trong 6 tháng hoạt động không ruby ​​... –

Trả lời

8

Sự khác biệt cho biết cách bạn truy cập các phương pháp.

phương pháp lớp sử dụng :: tách để chỉ nhắn có thể được gửi đến các đối tượng lớp/mô-đun, trong khi phương pháp dụ sử dụng # tách để cho biết rằng thông điệp có thể được gửi đến một đối tượng dụ.

Tôi sẽ chọn lớp Complex (trong Ruby 1.9) để chứng minh sự khác biệt. Bạn có cả hai số Complex::rectComplex#rect. Những phương pháp này có tính chất khác nhau và chúng phục vụ cho các mục đích hoàn toàn khác nhau. Complex::rect lấy một đối số thực và tưởng tượng, trả về một thể hiện mới là Complex, trong khi Complex#rect trả về một mảng các thành phần thực và tưởng tượng của cá thể.

ruby-1.9.1-p378 > x = Complex.rect(1,5) 
=> (1+5i) 
ruby-1.9.1-p378 > x.rect 
=> [1, 5] 
ruby-1.9.1-p378 > x.rect(2, 4) # what would this even do? 
ArgumentError: wrong number of arguments(2 for 0) 
    from (irb):4:in `rect' 
    from (irb):4 
    from /Users/mr/.rvm/rubies/ruby-1.9.1-p378/bin/irb:17:in `<main>' 

Tôi nghĩ lý do mà họ không sử dụng . như tách cho tất cả mọi thứ là nó sẽ là mơ hồ cho dù phương pháp này thuộc về một lớp hoặc một ví dụ. Bây giờ tôi đã quen với việc Ruby làm điều này, tôi thực sự coi đó là một nhược điểm đối với các công ước của ngôn ngữ khác, thành thật mà nói.

Ngoài ra, đây là một chút của một chủ đề hoàn toàn không liên quan từ lĩnh vực bởi vì tất cả các tin nhắn bạn có thể gửi những tin nhắn, nói đúng, ngay cả khi nó trông như một lĩnh vực truy cập công khai. Điều gần nhất bạn phải vào trường là thuộc tính hoặc biến mẫu, tất nhiên, luôn được đặt trước là @ và không phải là trực tiếp có thể truy cập từ bên ngoài trường hợp trừ khi bạn đang sử dụng thừa kế hoặc Object#instance_variable_get/_set.

Cụ thể là tại sao họ chọn ::#? :: có ý nghĩa với tôi bởi vì nó thông thường phân tách các không gian tên, nhưng # có lẽ chỉ là một biểu tượng không được sử dụng trong danh pháp khác và có thể được nhận biết một cách rõ ràng như một trình tách phương pháp.

+0

Bây giờ cho điểm thưởng: tại sao không sử dụng '::' để * gọi * phương thức lớp trong khi sử dụng ' # 'để gọi các phương thức ví dụ? Sau đó, không có sự mơ hồ cả trong việc đọc các tài liệu và trong mã thực tế. –

+0

@JUST: Bạn * có thể * làm 'Phức tạp :: rect (1,5)'. Nhưng kể từ khi '#' bắt đầu một dòng bình luận, tôi không nghĩ rằng sau này sẽ được thông qua bất cứ lúc nào sớm. –

+1

Tôi biết điều này. Vấn đề là nó vẫn còn khá đáng nguyền rủa để viết tư liệu với '#' thay vì '.'. ** Đặc biệt ** vì bạn có thể gọi với '::'. Đó là một trong những bí ẩn không thể giải quyết được của Ruby đối với tôi. Vì chúng ta đã có các quy tắc tiền tố '@' và '@@', tại sao không làm tương tự cho các phương thức và lực (không cho phép, * force *) các phương thức lớp được gọi với '::' và force (không cho phép, * force *) các phương thức instance được gọi với '.'? –

3

Tôi hiểu rằng đây là phương pháp được xác định bằng ri. Cái nào đến trước?

Vâng, đây là nguồn gốc của nó. Khi bạn sử dụng #, nó sẽ tự động siêu liên kết các phương pháp của bạn, do đó, tham chiếu đến các phương pháp khác trong tài liệu bắt đầu được bắt đầu bằng ký hiệu #.Xem here:

Tên 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 dấu gạch dưới hoặc đứng trước một nhân vật sẽ tự động được băm siêu liên từ văn bản bình luận để mô tả của họ.

Tuy nhiên, bạn thực sự không thể gọi phương thức theo cách này. Nhưng điều đó không đáng ngạc nhiên; sau khi tất cả, <cref ...> là một tuyên bố không hợp lệ trong C# mặc dù là một thẻ tài liệu hợp lệ.

+0

Vì vậy, đây là phương pháp đầu tiên được giới thiệu bởi băm? –

+0

@Justin L .: Đó là những gì tạo ra quy ước, vâng. –

+0

Có phải vì tệp rdoc đã sử dụng tên phương thức làm id neo và html sử dụng # để tách băm vị trí khỏi bộ nhận dạng tài liệu không? –

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