6

我尝试在 IRB(v0.9.6,Ruby 2.3.0)中使用 Refinement:

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

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

这基本上是文档中的确切设置(导致相同的错误)。

什么地方出了错?我该如何解决?

4

1 回答 1

7

这是 IRb 的错误或错误功能。众所周知,由于 IRb 的实现方式非常骇人听闻,它在所有极端情况下的行为并不正确。

可能大家都知道的不兼容之处在于,在 Ruby 中,定义在顶层的方法变成了 的private实例方法Object,而在 IRb 中,它们变成public了 的实例方法Object。另一个明显的行为差异是,在 IRb 中,require_relative它不起作用,因为它相对于当前文件进行搜索,但在 IRb 中,没有当前文件。

我相信,在接受的语法方面也存在一些差异,并且与局部变量以及它们何时被定义和未定义有关。

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

于 2016-01-06T06:43:08.487 回答