Có sự khác biệt giữaruột đôi Ruby (: :) điều hành khác nhau sử dụng
module Foo
class Engine < Rails::Engine
end
end
và
module Foo
class Engine < ::Rails::Engine
end
end
Có sự khác biệt giữaruột đôi Ruby (: :) điều hành khác nhau sử dụng
module Foo
class Engine < Rails::Engine
end
end
và
module Foo
class Engine < ::Rails::Engine
end
end
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
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
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" –
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. –
Tương thích với hệ thống tệp là tuyệt vời! thanks – CuriousMind
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