Tạo các biến mô-đun trong Ruby


111

Có cách nào để tạo một biến trong một mô-đun trong Ruby hoạt động tương tự như một biến lớp không? Ý của tôi là nó có thể được truy cập mà không cần khởi tạo phiên bản của mô-đun, nhưng nó có thể được thay đổi (không giống như hằng số trong mô-đun).

Câu trả lời:


158

Ruby tự nhiên hỗ trợ các biến lớp trong mô-đun, vì vậy bạn có thể sử dụng trực tiếp các biến lớp chứ không phải một số biến proxy hoặc giả-lớp:

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"

5
+1 Trên thực tế, tôi đã nghĩ rằng thuật ngữ 'biến lớp' gây hiểu lầm. Lớp là trường hợp đặc biệt của mô-đun và các biến lớp có thể xác định được trên mô-đun. Chúng nên được gọi là các biến mô-đun.
sawa

3
@sawa: Đó là phần nào gây hiểu lầm, nhưng đó là những gì của Ruby tự sử dụng: defined?(@@foo) => "class variable".
Andrew Grimm

1
Hoặc chúng có thể được gọi là trường tĩnh. Có vẻ đó là những gì họ đang có.
Peter Ajtai

@coreyward Này, sai lầm của tôi. Tại sao lại cần hai biến lớp '@@'? Nó không được coi là mùi mã, đặc biệt nếu lớp được mở rộng để sử dụng các biến lớp? Tôi đang thử nghiệm điều này và tôi nhận ra rằng tôi có thể nhận được kết quả tương tự từ một @biến phiên bản duy nhất . Có lý do cụ thể nào để sử dụng các biến lớp không? Cảm ơn vi đa trả lơi.
fabbb

2
tại sao các cuộc gọi khác nhau ở cuối: T.getT::get?
intxius

31

Nếu bạn không cần gọi nó từ bên trong một cá thể, bạn có thể chỉ cần sử dụng một biến cá thể trong thân mô-đun.

module SomeModule
  module_function
  def param; @param end
  def param= v; @param = v end
end

SomeModule.param
# => nil
SomeModule.param = 1
SomeModule.param
# => 1

Biến @paramthể hiện sau đó sẽ thuộc về mô-đun SomeModule, là một thể hiện của Modulelớp.


23

bạn có thể đặt một biến cá thể lớp trong mô-đun.

module MyModule
   class << self; attr_accessor :var; end
end

MyModule.var = 'this is saved at @var'

MyModule.var    
=> "this is saved at @var"

+1, nhưng tôi sẽ chỉ nhấn mạnh rằng các biến cá thể lớp khác với các biến lớp.
Andrew Grimm

4
vâng hoàn toàn .. và btw .. tôi không khuyên bạn nên sử dụng biến lớp nào cả .. một số điều không mong muốn xảy ra khi bạn sử dụng chúng .. hãy kiểm tra bài viết này để xem một số ví dụ oreillynet.com/ruby/blog/2007/01/…
Orlando

8

Bạn cũng có thể khởi tạo giá trị trong định nghĩa mô-đun:

module MyModule
  class << self
    attr_accessor :my_variable
  end
  self.my_variable = 2 + 2
end

p MyModule.my_variable
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.