2012-01-17 40 views
5
class TestClass 
    CONSTANT = 1 
end 

TestClass::CONSTANT = 2 

Dường như bạn có thể thay đổi giá trị của hằng số trong Ruby bất kỳ lúc nào. Tại sao họ thậm chí còn được gọi là "hằng số" nếu bạn có thể thay đổi chúng?Tại sao tôi có thể thay đổi các hằng số?

Mục đích của các 'hằng số' này là gì? Khả năng thay đổi giá trị của chúng làm cho lập trình dễ dàng hơn như thế nào?

+1

Cũng như những thứ khác, Ruby phải dựa vào tâm trí lành mạnh của các nhà phát triển cho một loạt những thứ được thực thi bởi trình biên dịch/phiên dịch bằng các ngôn ngữ khác do tính năng động của nó. Đó là một quy ước mà bạn không thay đổi hằng số và có thể chắc chắn rằng chúng sẽ không bị thay đổi trong thời gian chạy. – Reactormonk

+0

có thể trùng lặp của [Ném ngoại lệ khi gán lại một hằng số trong Ruby?] (Http://stackoverflow.com/questions/3023617/throw-exception-when-re-assigning-a-constant-in-ruby) –

Trả lời

6

Vâng, hằng số trong Ruby tương đối biến. Các đối tượng mà chúng trỏ tới có thể được hoán đổi (như trong ví dụ của bạn) và trạng thái của chúng cũng có thể được thay đổi.

class TestClass 
    Constant = [] 
end 
TestClass::Constant << "no warning at all!" 

Lợi thế duy nhất mà chúng cung cấp là cảnh báo được tạo khi bạn tạo điểm cố định hiện tại cho đối tượng khác. Xem "Programming Ruby", section "Variables and Constants". Nó cũ nhưng vẫn hợp lệ.

Mục đích cho hằng số của Ruby tồn tại là báo hiệu rằng một tham chiếu nhất định không nên thay đổi. Ví dụ: nếu bạn làm Math::PI = 3.0 bạn xứng đáng được cảnh báo.

Về mặt lý thuyết, bạn có thể phá vỡ khả năng tương thích với việc triển khai ban đầu và thực thi bất biến của hằng số. Kết quả là bạn có thể đạt được một cải thiện hiệu suất nhỏ nhờ vào phương pháp được tối ưu hóa.

Trong ví dụ trên, bạn sẽ biết rằng Constant.is_a? Array để gửi biểu tượng << đến phương thức thực tế chỉ có thể thực hiện một lần, vào lần thực thi đầu tiên của dòng đó. Vấn đề là Ruby cho phép bạn xác định lại Array#<< do đó làm cho vấn đề trở nên phức tạp hơn.

Kiểm tra xem các triển khai Ruby khác nhau có cố gắng sử dụng tối ưu hóa như vậy sẽ yêu cầu một số nghiên cứu bổ sung và đào trong tài liệu hoặc nguồn của họ.

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