การเข้าถึงค่าคงที่ของคลาส


142

เมื่อฉันมีต่อไปนี้:

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

  ...
end

มีวิธีการเข้าถึงด้วยFoo::CONSTANT_NAMEหรือฉันต้องทำวิธีการเรียนเพื่อเข้าถึงค่าหรือไม่

คำตอบ:


244

สิ่งที่คุณโพสต์ควรทำงานอย่างสมบูรณ์:

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

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

2
อืมฉันต้องพิมพ์ผิดเมื่อฉันทดสอบก่อนหน้านี้ Ooops :)
Jeremy Smith

12
เพื่อสิ่งนี้จะเป็นค่าคงที่อย่างแท้จริงอย่าลืมเพิ่ม. freeze ในตอนท้ายของค่า! CONSTANT_NAME = ["a", "b", "c"].freeze
mutexkid

6
ปะปนอยู่เสมอ::และ.;)
Nick

สิ่งที่ยากที่จะสังเกตเห็นเมื่อตัวพิมพ์ใหญ่;)
Michael Yin

42

หากคุณกำลังเขียนรหัสเพิ่มเติมภายในชั้นเรียนของคุณที่มีค่าคงที่คุณสามารถปฏิบัติกับมันเหมือนโลก

class Foo
  MY_CONSTANT = "hello"

  def bar
    MY_CONSTANT
  end
end

Foo.new.bar #=> hello

หากคุณกำลังเข้าถึงค่าคงที่นอกคลาสให้ใส่คำนำหน้าด้วยชื่อคลาสแล้วตามด้วยเครื่องหมายโคลอนสองตัว

Foo::MY_CONSTANT  #=> hello

42

ทางเลือกบางอย่าง:

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

มีวิธีการเข้าถึงFoo::CONSTANT_NAMEหรือไม่?

ใช่นั่นคือ:

Foo::CONSTANT_NAME

เมื่อฉันพยายามที่จะเข้าถึงฉันมีคำเตือนด้านล่าง คำเตือน: ค่าคงที่เริ่มต้นแล้ว TestData :: CONSTANT_VAR ตัวแปรนี้ไม่ได้เริ่มต้นที่อื่น ทำไมฉันถึงได้รับคำเตือนนี้?
ASM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.