Почему я получил, что 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, всегда заставлял его уходить.

Другие вопросы по тегам