Truy cập các hằng số của một lớp


142

Khi tôi có những điều sau đây:

class Foo
   CONSTANT_NAME = ["a", "b", "c"]

  ...
end

Có cách nào để truy cập với Foo::CONSTANT_NAMEhoặc tôi phải tạo một phương thức lớp để truy cập giá trị không?

Câu trả lời:


244

Những gì bạn đã đăng nên hoạt động hoàn hảo:

class Foo
  CONSTANT_NAME = ["a", "b", "c"]
end

Foo::CONSTANT_NAME
# => ["a", "b", "c"]

2
Hmm, tôi đã nhầm lẫn khi tôi kiểm tra trước đó. Ooops :)
Jeremy Smith

12
để điều này thực sự là một hằng số, đừng quên thêm .freeze vào cuối giá trị! CONSTANT_NAME = ["a", "b", "c"].freeze
mutexkid

6
Luôn luôn trộn lẫn ::.;)
Nick

Mọi thứ thật khó để nhận ra khi bị lật đổ;)
Michael Yin

42

Nếu bạn đang viết mã bổ sung trong lớp chứa hằng số, bạn có thể coi nó như một toàn cục.

class Foo
  MY_CONSTANT = "hello"

  def bar
    MY_CONSTANT
  end
end

Foo.new.bar #=> hello

Nếu bạn đang truy cập vào hằng số bên ngoài lớp, hãy thêm tiền tố vào tên lớp, theo sau là hai dấu hai chấm

Foo::MY_CONSTANT  #=> hello

42

Một số lựa chọn thay thế:

class Foo
  MY_CONSTANT = "hello"
end

Foo::MY_CONSTANT
# => "hello"

Foo.const_get :MY_CONSTANT
# => "hello"

x = Foo.new
x.class::MY_CONSTANT
# => "hello"

x.class.const_defined? :MY_CONSTANT
# => true

x.class.const_get :MY_CONSTANT
# => "hello"

17

Có cách nào để truy cập Foo::CONSTANT_NAME?

Có, có:

Foo::CONSTANT_NAME

Khi tôi đang cố gắng truy cập nó, tôi có cảnh báo dưới đây. cảnh báo: đã khởi tạo hằng số TestData :: CONSTANT_VAR Biến này không được khởi tạo ở bất kỳ nơi nào khác. Tại sao tôi có cảnh báo này?
HỎI
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.