为什么我在 IRB 中使用 Refinement 时得到 "main.using is permitted only at toplevel"?

Why did I get "main.using is permitted only at toplevel" when I used a Refinement in 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

这基本上是 the exact setup from the documentation(导致相同的错误)。

出了什么问题?我该如何解决这个问题?

这可能是 IRb 的错误或功能不当。 well-known 由于 IRb 的实现方式非常骇人听闻,它对所有 corner-cases.

的行为并不正确

可能每个人都知道的不兼容性是,在 Ruby 中,定义在 top-level 的方法成为 Objectprivate 个实例方法,而在 IRb 中,它们成为 public Object 的实例方法。另一个明显的行为差异是,在 IRb 中,require_relative 不起作用,因为它相对于当前文件进行搜索,但在 IRb 中, 没有 当前文件。

我认为,在接受哪些语法方面也存在一些差异,这与局部变量有关,以及它们何时定义和未定义。

因此,可能也存在一些行为差异并不是不可想象的。改进。事实上,我自己也遇到过该错误消息,并且 运行 IRb 之外的完全相同的代码,无论是 ruby -e,来自文件,还是来自不同的 REPL,总是让它消失。