TL; DR: Tùy theo. Các giá trị có nghĩa là được sử dụng bên ngoài lớp học? Họ có thể trở nên năng động không? Họ có thể thay đổi cho các lớp con không?
Khi @sawa viết, nhược điểm của phương thức (được viết theo cách này) là một mảng và chuỗi mới được tạo ra mỗi lần.
Cách tốt hơn để viết nó sẽ là:
class Example
def self.options
@options ||= ['Yes', 'No', 'Not sure']
end
end
Mảng được lưu trữ trong trường hợp biến @options
, để tránh tạo ra một mảng mới mỗi lần.
Bằng văn bản theo cách này, phương pháp này rất giống với hằng số.
Một sự khác biệt quan trọng là nếu Example
được subclassed, nó sẽ tự nhiên hơn để tinh chỉnh các phương pháp options
hơn hằng số OPTIONS
:
class Parent < Example
def self.options
@options ||= [*super, 'Extra']
end
end
Để làm được điều gì đó tương tự với các hằng số là khó khăn. Hãy tưởng tượng rằng danh sách các tùy chọn được sử dụng trong một phương pháp học, điều này sẽ trông giống như:
class Example
OPTIONS = ['Yes', 'No', 'Not sure']
def self.foo(arg)
puts "Available options:",
self::OPTIONS # The self:: is needed here
# ...
end
end
class Parent < Example
OPTIONS = [*superclass::OPTIONS, 'Extra']
end
Điều khó khăn về hằng số, là self::OPTIONS
và OPTIONS
không phải là lúc nào cũng giống nhau, trong khi self.options
và options
đều giống nhau. Hằng số thường được sử dụng mà không chỉ định phạm vi (ví dụ: OPTIONS
thay vì self::OPTIONS
) và kế thừa sẽ không hoạt động trong trường hợp đó.
Lưu ý rằng phương pháp cho bạn cơ hội để tạo kết quả động (tức là trả lại các kết quả khác nhau tùy thuộc vào các trường hợp khác) mà không thay đổi API.
Lưu ý cuối cùng: Tôi khuyên bạn nên gọi số freeze
trên mảng của mình để tránh bất kỳ ai sửa đổi nó.
Phương pháp được chấp nhận chung là sau khi Upercase với các ý kiến là một hình thức tài liệu hướng dẫn cho người dùng rằng đây là một hằng số –
Không liên quan đến một câu trả lời có thể, tôi sẽ đề nghị sử dụng những biểu tượng trên chuỗi trừ khi mã của bạn đặc biệt cần chuỗi. Do đó '[: yes,: no,: not_sure]' –