2016-01-05 5 views
5

Iは、IRB(v0.9.6、ルビー2.3.0)に詳細化を使用しようとした:なぜ私はIRBで洗練を使用したときに `main.usingはトップレベルでのみ許可されます`を得ましたか?

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あります。

何が問題になりましたか?これをどうやって解決するのですか?

+0

バージョンの問題のように見えますが、私は '(irb):2:warning:洗練されたもので、Rubyの将来のバージョンで動作が変わるかもしれません!私は 'irb 0.9.6(09/06/30)'と 'ruby20'を使用しています – hek2mgl

+0

@ hek2mgl Ruby/IRBの最新バージョンを使用しています。詳細は実験的ではありません。その言語はすべてのドキュメントから削除されています。 –

+1

私にはirbのバグのようです。それはうまく動作します。また、最上位レベルで正確に使用しているため、エラーメッセージには意味がありません。 – Jesuspc

答えて

5

これは、IRbのバグまたは不正な機能のいずれかです。 IRbが実装されているため、すべてのコーナーケースで正しく動作しないことはよく知られています。

非互換性は、おそらく誰もが知っているがIRBで、彼らはObjectpublicインスタンスメソッドになるのに対し、Rubyで、トップレベルで定義された方法は、Objectprivateインスタンスメソッドになるということです。もう1つの明白な動作上の違いは、IRbではrequire_relativeが現在のファイルを基準にして検索されるため、IRBでは動作しません。は現在のファイルです。

構文にはいくつかの違いがありますが、それはローカル変数を使って受け入れることができると思います。また、正確には定義されていない場合もあります。

したがって、動作上の違いがある可能性はありません。精緻化。実際には、私自身がそのエラーメッセージに遭遇し、ファイルからruby -e、または別のREPLからIRBのまったく同じコードを実行すると、いつもそれが消えてしまいました。

関連する問題