当我在IRB中使用精炼时,为什么我得到“main.using只允许在顶层使用”?

时间:2016-01-05 20:21:24

标签: ruby irb refinements

我试图在IRB中使用Refinement(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(导致相同的错误)。

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

1 个答案:

答案 0 :(得分:5)

它是IRb的错误或错误。众所周知,由于IRb实施的方式非常糟糕,因此对于所有角落情况都不能正常运行。

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

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

因此,可能还存在一些行为差异并不是不可思议的。改进。实际上,我自己也遇到过这条错误消息,并且在IRb外部运行完全相同的代码,无论是require_relative,还是文件,还是来自不同的REPL,总是让它消失。