Trong Ruby, tra cứu liên tục bị ảnh hưởng bởi cách lồng và các phương thức giữ lại lồng nhau của chúng.Làm thế nào để tìm được cách lồng vào trong Ruby?
Ví dụ, nếu tôi có các phân hệ:
module A
X = 1
end
module B
X = 2
end
module Foo
end
tôi có thể xác định một phương pháp Foo.a
mà có một tổ của [A, Foo]
:
module Foo
module ::A
Module.nesting #=> [A, Foo]
def Foo.a
X
end
end
end
Foo.a #=> 1
Và một phương pháp Foo.b
mà có một tổ của [Foo, B]
:
module B
module ::Foo
Module.nesting #=> [Foo, B]
def Foo.b
X
end
end
end
Foo.b #=> 2
Sự khác biệt trở nên rõ ràng nếu tôi xác định Foo::X
:
Foo::X = 3
Foo.a #=> 1 <- still resolves to A::X
Foo.b #=> 3 <- now resolves to Foo::X
Nhưng làm cách nào để xác định lồng của một phương thức nhất định?
Thành thật mà nói, tôi thậm chí không chắc chắn tại sao 'Foo.a' và' Foo.b' được xác định và có sẵn trong chính. –
@EricDuminil Tôi muốn nói vì ':: Foo', nó đề cập đến hằng số cấp cao nhất. – Stefan
Đã không nhận ra rằng các mô-đun cấp cao nhất có thể được lồng vào người khác, wow. – akuhn