2015-12-17 4 views
5

Po prostu utknąłem w tym przez chwilę. Weź to podstawa:Dlaczego Ruby nie znajduje zajęć w wyższym zakresie, gdy moduł jest określony za pomocą ::?

module Top 
    class Test 
    end 

    module Foo 
    end 
end 

Później mogę zdefiniować klasy wewnątrz Foo który rozciąga Test w ten sposób:

module Top 
    module Foo 
    class SomeTest < Test 
    end 
    end 
end 

Jednakże, jeśli staram się zminimalizować wcięcia za pomocą :: określić moduł:

module Top::Foo 
    class Failure < Test 
    end 
end 

ten nie powiedzie się z:

NameError: uninitialized constant Top::Foo::Test

Czy jest to błąd, czy jest to tylko logiczna konsekwencja sposobu, w jaki Ruby rozpoznaje nazwy zmiennych?

Odpowiedz

7

Is this a bug, or is it just a logical consequence

Jest to "dziwactwo". Niektórzy uważają to za błąd.

Zakresy rodzica używane do wyszukiwania nierozwiązanych stałych są określane przez zagnieżdżanie modułów. Tak się składa, że ​​gdy używasz module Top::Foo, tworzy on tylko jeden poziom zagnieżdżania zamiast dwóch. Przestrzegać:

module Top 
    module Foo 
    class SomeTest 
     Module.nesting # => [Top::Foo::SomeTest, Top::Foo, Top] 
    end 
    end 
end 

module Top::Foo 
    class SomeTest 
    Module.nesting # => [Top::Foo::SomeTest, Top::Foo] 
    end 
end 
+2

Brzmi jak bug do mnie: P Ale odpowiedzi bardzo pouczające, dziękuję – Hubro

+0

Powiedziałbym, uważam, że to błąd, czy ktoś znalazł raport o błędzie w Ruby na ten temat? Chciałbym wnieść swój wkład w dyskusję i przyjrzeć się temu, co byłoby związane z naprawieniem tego. –

+0

Uwaga: znaleziono link stwierdzający, że jest celowy [tutaj] (https://bugs.ruby-lang.org/issues/11705) –

1

To jest oczekiwane. Korzystanie z :: zmienia zakres stałego wyszukiwania i oczekuje, że Test zostanie zdefiniowany pod Top::Foo.

Aby uzyskać oczekiwany efekt, można napisać:

module Top::Foo 
    class SomeTest < Top::Test 
    end 
end 

czyli

module Top 
    class Foo::SomeTest < Test 
    end 
end 

lub nawet:

class Top::Foo::SomeTest < Top::Test 
end 
Powiązane problemy