2012-05-07 34 views

Trả lời

47

Constants trong Ruby được lồng nhau như các tập tin và thư mục trong hệ thống tập tin. Vì vậy, hằng số được xác định duy nhất theo đường dẫn của chúng.

Để vẽ một tương tự với hệ thống file:

::Rails::Engine #is an absolute path to the constant. 
# like /Rails/Engine in FS. 

Rails::Engine #is a path relative to the current tree level. 
# like ./Rails/Engine in FS. 

Dưới đây là hình minh họa của lỗi có thể:

module Foo 

    # We may not know about this in real big apps 
    module Rails 
    class Engine 
    end 
    end 

    class Engine1 < Rails::Engine 
    end 

    class Engine2 < ::Rails::Engine 
    end 
end 

Foo::Engine1.superclass 
=> Foo::Rails::Engine # not what we want 

Foo::Engine2.superclass 
=> Rails::Engine # correct 
+0

Phải. Vì vậy, nếu bạn đã gọi Rails :: Engine từ một module sử dụng tên 'Module Foo', nó có thể giải thích nó như là' Foo :: Rails :: Engine'. Tôi đã nhìn thấy các lỗi như thế này vào các thời điểm và đã phải bổ sung thêm '::' trước một bao gồm. –

+1

Tương thích với hệ thống tệp là tuyệt vời! thanks – CuriousMind

+5

Nó được lấy từ cuốn sách "Metaprogramming Ruby" của Paolo Perrotta. Cuốn sách rất hữu ích để làm sâu sắc thêm kiến ​​thức về Ruby. – Flexoid

5
Rails::Engine #is a path relative to the current tree level. 
# like ./Rails/Engine in FS. 

này không hoàn toàn đúng!

Hãy có một ví dụ:

module M 
    Y = 1 
    class M 
    Y = 2 
    class M 
     Y = 3 
    end 
    class C 
     Y = 4 
     puts M::Y 
    end 
    end 
end 

# => 3 

module M 
    Y = 1 
    class M 
    Y = 2 
    class C 
     Y = 4 
     puts M::Y 
    end 
    end 
end 

# => 2 

module M 
    Y = 1 
    class M 
    Y = 2 
    class M 
     Y = 4 
     puts M::Y 
    end 
    end 
end 

# => 4 

Vì vậy, khi bạn nói M :: Y ruby ​​nhìn lên cho defintion gần nhất không có vấn đề nếu nó nằm bên trong phạm vi hiện tại hoặc phạm vi bên ngoài hoặc phạm vi bên ngoài bên ngoài, vv

+0

Ruby là cái này? Ngày 2.2.4, tôi nhận được 3, 3, và 4 và nhiều "cảnh báo liên tục cấp cao nhất đã được tham chiếu" –

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