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::rect
và Complex#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 ::
và #
? ::
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.
Nguồn
2010-06-26 12:32:54
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 ... –