มีวิธีใดในการสร้างตัวแปรในโมดูลใน Ruby ที่จะทำงานคล้ายกับตัวแปรคลาสหรือไม่? สิ่งที่ฉันหมายถึงคือมันจะสามารถเข้าถึงได้โดยไม่ต้องเริ่มต้นอินสแตนซ์ของโมดูล แต่สามารถเปลี่ยนแปลงได้ (ไม่เหมือนกับค่าคงที่ในโมดูล)
มีวิธีใดในการสร้างตัวแปรในโมดูลใน Ruby ที่จะทำงานคล้ายกับตัวแปรคลาสหรือไม่? สิ่งที่ฉันหมายถึงคือมันจะสามารถเข้าถึงได้โดยไม่ต้องเริ่มต้นอินสแตนซ์ของโมดูล แต่สามารถเปลี่ยนแปลงได้ (ไม่เหมือนกับค่าคงที่ในโมดูล)
คำตอบ:
Ruby สนับสนุนตัวแปรคลาสในโมดูลโดยกำเนิดดังนั้นคุณสามารถใช้ตัวแปรคลาสได้โดยตรงและไม่ใช่ตัวแปรพร็อกซีหรือคลาสหลอก:
module Site
@@name = "StackOverflow"
def self.setName(value)
@@name = value
end
def self.name
@@name
end
end
Site.name # => "StackOverflow"
Site.setName("Test")
Site.name # => "Test"
defined?(@@foo) => "class variable"
.
@
ตัวแปรอินสแตนซ์เดียว มีเหตุผลเฉพาะในการใช้ตัวแปรคลาสหรือไม่? ขอบคุณสำหรับการตอบกลับ.
T.get
และT::get
?
หากคุณไม่จำเป็นต้องเรียกใช้จากภายในอินสแตนซ์คุณสามารถใช้ตัวแปรอินสแตนซ์ภายในตัวโมดูล
module SomeModule
module_function
def param; @param end
def param= v; @param = v end
end
SomeModule.param
# => nil
SomeModule.param = 1
SomeModule.param
# => 1
@param
จากนั้นตัวแปรอินสแตนซ์จะเป็นของโมดูลSomeModule
ซึ่งเป็นอินสแตนซ์ของModule
คลาส
คุณสามารถตั้งค่าตัวแปรอินสแตนซ์คลาสในโมดูล
module MyModule
class << self; attr_accessor :var; end
end
MyModule.var = 'this is saved at @var'
MyModule.var
=> "this is saved at @var"
คุณยังสามารถเริ่มต้นค่าภายในนิยามโมดูล:
module MyModule
class << self
attr_accessor :my_variable
end
self.my_variable = 2 + 2
end
p MyModule.my_variable