2010-07-04 39 views

Trả lời

69
class A 
    CONST = 'A' 

    def initialize 
    puts self.class::CONST 
    end 
end 

class B < A 
    CONST = 'B' 
end 

A.new # => 'A' 
B.new # => 'B' 
+0

Hoàn hảo, cảm ơn rất nhiều! – Tom

+0

Vì vậy ... điều này có nghĩa là không có cách nào để làm điều đó mà không thay đổi ở khắp mọi nơi trong lớp A sử dụng CONST? – nohat

+2

Có. Tra cứu liên tục thường bị ràng buộc tại thời gian biên dịch. –

0

tôi đã có một vài vấn đề với các giải pháp của Konstantin Haase. Khi truy cập hằng số trong một đối tượng instantiated của lớp kế thừa, hằng số cha được sử dụng.

Tôi phải tham khảo rõ ràng lớp học.

self.class::CONST 

cổ vũ

+2

khác với câu trả lời của anh ấy như thế nào? – akostadinov

0

Trong trường hợp có ai tìm thấy này và đang sử dụng phần mở rộng mô-đun thay vào đó, chỉ cần sử dụng

self::CONST

1

Xin lỗi tôi không thể lấy mã định dạng để làm việc trong một 'bình luận 'chỉ trong một' câu trả lời 'nhưng điều này là để đáp lại câu hỏi của akostadinov với Hendrik "điều này khác với câu trả lời của [Konstantin] như thế nào?"

Tôi đoán Hendrik đang cố truy cập hằng số từ các phương thức trong lớp kế thừa của mình & phụ thuộc vào nếu đó là một cá thể hoặc phương thức tĩnh. Nó có vẻ cư xử như bạn mong đợi trong một phương pháp thể hiện. Nhưng có lẽ hoặc có thể không phải là cách bạn mong đợi cho một phương pháp tĩnh. Ngay cả khi đó không phải là những gì Hendrik nghĩa, điều này có thể đáng chú ý:

Nếu bạn có các định nghĩa lớp chính xác như Konstantin, nhưng bạn thêm một phương pháp để loại A như thế này:

def self.print_const 
    puts CONST 
end 

Sau đó, bạn sẽ có được một cả hai lần:

A.print_const # prints A 
B.print_const # prints A 

Tuy nhiên, nếu bạn xác định các phương pháp A bằng cách tham khảo các lớp:

def self.print_const 
    puts self::CONST 
end 

Sau đó, bạn nhận được:

A.print_const # prints A 
B.print_const # prints B 
Các vấn đề liên quan