2016-01-05 10 views
5

Я пытался использовать вписанный в IRB (v0.9.6, Ruby 2.3.0):Почему я получаю `main.using разрешен только при заполнении, когда я использовал уточнение в IRB?

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

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

Это в основном the exact setup from the documentation (что приводит к одной и той же ошибке).

Что пошло не так? Как это исправить?

+0

Похоже, проблема с версией, я получил '(irb): 2: предупреждение: уточнения являются экспериментальными, и поведение может измениться в будущих версиях Ruby!'. Я использую 'irb 0.9.6 (09/06/30)' и 'ruby20' – hek2mgl

+0

@ hek2mgl Я использую последнюю версию Ruby/IRB. Уточнения больше не являются экспериментальными; этот язык был удален из всех документов. –

+1

Похоже на ошибку в irb для меня. Он отлично работает с подглядыванием. Также сообщение об ошибке не имеет смысла, так как мы вызываем, используя точно на верхнем уровне. – Jesuspc

ответ

5

Это либо ошибка, либо неисправность IRb. Хорошо известно, что из-за довольно хакерского способа IRb реализован, он не ведет себя корректно для всех угловых случаев.

Несовместимость вероятно, все знают, что в Ruby, методы, определенные на верхнем уровне стали private методы экземпляра Object, тогда как в IRB, они становятся public методы экземпляра Object. Еще одна очевидная разница в поведении заключается в том, что в IRb require_relative не работает, потому что он ищет относительно текущего файла, но в IRb не является текущим файлом.

Есть также некоторые различия в том, какой синтаксис принимается, я считаю, и что-то связанное с локальными переменными и когда они точно определены и не определены.

Таким образом, не исключено, что возможны и некоторые поведенческие различия. Уточнения. Фактически, я сам столкнулся с этим сообщением об ошибке и запустил тот же самый код вне IRb, либо с ruby -e, либо из файла, либо из другого REPL, который всегда уходил.

 Смежные вопросы

  • Нет связанных вопросов^_^