2012-10-17 23 views
8

Bắt đầu từ trong Ruby 1.9.3, chúng ta có thể tạo ra các hằng số tin:Module.private_constant làm gì? Có cách nào để chỉ liệt kê các hằng số riêng tư không?

module M 
    class C; end 
    private_constant :C 
end 

Có một tài liệu tốt về điều này không? Có cách nào để lấy tên chỉ các hằng số riêng tư tương tự như gọi số constants

+0

Vui lòng giải thích bạn đang có kế hoạch sử dụng cái gì. –

+0

Ruby không có hằng số riêng tư. Gần nhất bạn có thể nhận được là một biến lớp, nhưng đó không phải là khủng khiếp riêng tư, vì nó được chia sẻ với tất cả các lớp con. – Linuxios

+0

@RyanBigg Tôi không có bất kỳ sử dụng cho nó. Tôi không hiểu sự liên quan của câu hỏi của bạn với câu hỏi của tôi. – sawa

Trả lời

3

Như của Ruby 2.1, trong khi Module#constants chỉ bao gồm các hằng số nào, nếu bạn đặt inherit=false, bạn sẽ nhận được hằng tin là tốt. Vì vậy, nếu bạn tìm thấy một hằng số trong constants(false) nhưng không phải trong constants (và bạn không quan tâm đến các hằng số kế thừa), đó có thể là một cách ít hoặc đáng tin cậy để biết liệu đó là riêng tư hay không.

class Module 
    def private_constants 
    constants(false) - constants 
    end 
end 

module Foo 
    X = 1 
    Y = 2 
    private_constant :Y 
end 

puts "Foo.constants = #{Foo.constants}" 
puts "Foo.constants(false) = #{Foo.constants(false)}" 
puts "Foo.private_constants = #{Foo.private_constants}" 

# => Foo.constants = [:X] 
# => Foo.constants(false) = [:X, :Y] 
# => Foo.private_constants = [:Y] 

này được cung cấp tài liệu, và tôi không chắc chắn nếu nó cố ý, nhưng theo kinh nghiệm nó hoạt động. Tôi sẽ trở lại với các bài kiểm tra đơn vị.


Cập nhật: Dường như đây là a bug in Ruby, và có thể biến mất trong một phiên bản tương lai.

+1

Cảm ơn. Tôi không biết điều đó. Nhưng có vẻ lạ. Nó có thể là lỗi của Ruby. – sawa

+1

Tôi đã thực hiện một báo cáo nhưng: https://bugs.ruby-lang.org/issues/12345. – sawa

+1

@sawa Có vẻ như lỗi đã được chấp nhận. Tôi đã cập nhật câu trả lời. –

9

Không có thứ gì như các hằng số riêng tư cho đến khi Ruby 1.9.3. Để có được danh sách tất cả các hằng số, bạn chỉ cần sử dụng #constants.

module Mod 
    CONST = "value" 
end 

Mod.constants #=> [:CONST] 

Từ 1.9.3, .private_constant đã được bổ sung, nhưng như không có gì là thực sự tin, bạn có thể làm ...

module Mod 
    CONST = "value" 
    private_constant :CONST 
end 

Mod.const_get(:CONST) #=> "value" 

Tôi không nghĩ rằng có một cách để nhận được một danh sách các tất cả các hằng số riêng tư nhưng bạn vẫn có thể kiểm tra sự hiện diện của một tên cụ thể.

Mod.const_defined?(:CONST) #=> true 
+0

Vậy mã sau có nghĩa là gì? 'lớp A; B = 5; private_constant: B; end' – sawa

+1

Với chỉnh sửa của bạn, nửa sau câu trả lời của bạn mâu thuẫn với nửa đầu. –

+0

Đó là vì tôi đã viết "trong Ruby 1.9.3" thay vì "cho đến khi Ruby 1.9.3" ;-) – thoferon