2016-01-05 33 views
5

Próbowałem użyć udoskonalenie w IRB (v0.9.6, Ruby 2.3.0):Dlaczego otrzymałem polecenie "main.using jest dozwolone tylko na poziomie", gdy użyłem wyrafinowania w IRB?

module Foo 
    refine Object do 
    def foo() "foo" end 
    end 
end 

using Foo # => RuntimeError: main.using is permitted only at toplevel 

Jest to w zasadzie the exact setup from the documentation (co prowadzi do tego samego błędu).

Co poszło nie tak? Jak to naprawić?

+0

Wygląda na problem z wersją, mam '(irb): 2: warning: Udoskonalenia są eksperymentalne, a zachowanie może się zmienić w przyszłych wersjach Ruby!'. Używam 'irb 0.9.6 (09/06/30)' i 'ruby20' – hek2mgl

+0

@ hek2mgl Używam najnowszej wersji Ruby/IRB. Udoskonalenia nie są już eksperymentalne; ten język został usunięty ze wszystkich dokumentów. –

+1

Wygląda mi na błąd w irb. Działa dobrze z podstępem. Również komunikat o błędzie nie ma sensu, ponieważ dzwonimy używając dokładnie na najwyższym poziomie. – Jesuspc

Odpowiedz

5

To błąd lub pomyłka IRb. Powszechnie wiadomo, że ze względu na dość hackowską metodę IRb jest zaimplementowana, nie zachowuje się poprawnie we wszystkich przypadkach narożnych.

Niezgodność prawdopodobnie wiadomo jest, że w Ruby metod zdefiniowanych w górnym poziomie się private metody instancja Object, natomiast w IRB stają public metody instancja Object. Inną oczywistą różnicą w zachowaniu jest to, że w IRb, require_relative nie działa, ponieważ szuka w odniesieniu do bieżącego pliku, ale w IRb, tam nie jest bieżącym plikiem.

Istnieją również pewne różnice w zakresie składni, która jest akceptowana, jak sądzę, i ma coś wspólnego ze zmiennymi lokalnymi, a kiedy dokładnie są i nie są zdefiniowane.

Tak więc nie jest wykluczone, że mogą również występować pewne różnice w zachowaniu. Udoskonalenia. Faktycznie, sam napotkałem ten komunikat o błędzie i uruchomiłem dokładnie ten sam kod poza IRb, albo z ruby -e, z pliku, albo z innego REPL, zawsze powodowało, że odszedł.