Почему я получил, что main.using разрешено только на верхнем уровне, когда я использовал уточнение в IRB?
Я пытался использовать уточнение в IRB (v0.9.6, Ruby 2.3.0):
module Foo
refine Object do
def foo() "foo" end
end
end
using Foo # => RuntimeError: main.using is permitted only at toplevel
Это в основном точная настройка из документации (что приводит к той же ошибке).
Что пошло не так? Как это исправить?
1 ответ
Это либо ошибка, либо ошибка в IRb. Общеизвестно, что из-за довольно хакерского способа реализации IRb он ведет себя некорректно для всех угловых случаев.
Несовместимость, вероятно, все знают, что в Ruby методы, определенные на верхнем уровне, становятся private
методы экземпляра Object
тогда как в IRb они становятся public
методы экземпляра Object
, Другое очевидное поведенческое различие заключается в том, что в IRb require_relative
не работает, потому что он ищет относительно текущего файла, но в IRb нет текущего файла.
Я также считаю, что есть некоторые различия в том, какой синтаксис принимается, и что-то связанное с локальными переменными, и когда они точно определены и не определены.
Таким образом, не исключено, что могут быть и некоторые поведенческие различия. Уточнения. На самом деле, я сам столкнулся с этим сообщением об ошибке и запускаю тот же код вне IRb, либо с ruby -e
из файла, или из другого REPL, всегда заставлял его уходить.