2011-10-19 34 views
35

Vì vậy Module thể được sử dụng trong Ruby để cung cấp namespacing ngoài mixins, như vậy:Sự khác biệt giữa các quy ước không gian tên Ruby này là gì?

module SomeNamespace 
    class Animal 

    end 
end 

animal = SomeNamespace::Animal.new 

Nhưng tôi cũng thấy được sử dụng sau đây:

module SomeNamespace 
end 

class SomeNamespace::Animal 

end 

animal = SomeNamespace::Animal.new 

Câu hỏi của tôi là làm thế nào họ' khác nhau (nếu chúng là) và đó là Ruby thành ngữ hơn?

Trả lời

37

Sự khác biệt nằm trong lồng nhau.

Trong ví dụ dưới đây, bạn có thể thấy rằng phương pháp cũ sử dụng lớp Foo, có thể nhận được các biến hằng số của phạm vi bên ngoài BAR_A không có lỗi.

Trong khi đó, lớp Baz sẽ đánh bom với lỗi của hằng số không được khởi tạo A :: B :: Baz :: BAR_A. Vì nó không mang lại A :: * ngầm, chỉ A :: B :: * một cách rõ ràng.

module A 
    BAR_A = 'Bar A!' 
    module B 
    BAR_B = 'Bar B!' 
     class Foo 
     p BAR_A 
     p BAR_B 
     end 
    end 
end 

class A::B::Baz 
    p BAR_A 
    p BAR_B 
end 

Cả hai hành vi đều có chỗ đứng. Không có sự đồng thuận thực sự nào trong cộng đồng theo ý kiến ​​của tôi, đó là One Way Ruby Way (tm). Cá nhân tôi sử dụng trước đây, hầu hết thời gian.

5

Sự khác biệt duy nhất giữa hai cách tiếp cận là điểm thứ hai sẽ ném uninitialized constant Object::SomeNamespace nếu không gian tên trước đây chưa được khai báo.

Khi được khai báo trong một tệp, tôi sẽ chọn tùy chọn đầu tiên vì bạn không phải lặp lại SomeNamespace.

Khi sử dụng nhiều file tôi cũng sử dụng điều thứ hai, để tránh chạy vào vấn đề sau đây:

# in a.rb 
require 'b' 

module SomeNamespace 
    def self.animal 
    Animal.new 
    end 
end 

# in b.rb 
class SomeNamespace::Animal 

end 

# irb 
require 'a' # explodes with the uninitialized constant error 

ví dụ này có thể được trù định, nhưng thật dễ dàng để kích hoạt nó nếu cơ sở mã của bạn là một chút lớn hơn. Tôi thường sử dụng cách rõ ràng (cái đầu tiên của bạn) để tránh điều này.

Một điều có thể hữu ích khi sử dụng biểu mẫu thứ hai là nó sẽ phát hiện lỗi chính tả trong không gian tên.

Có vẻ như không phải là cách được thiết lập để tạo không gian tên, Ví dụ: pha trộn cả hai cách tiếp cận: first one, second one.

Các vấn đề liên quan