From: rubikitch@... Date: 2008-08-07T04:29:07+09:00 Subject: [ruby-list:45309] Re: グローバルにdefしたメソッドのスコープ From: take_tk Subject: [ruby-list:45308] Re: グローバルにdefしたメソッドのスコープ Date: Thu, 7 Aug 2008 03:05:07 +0900 > これって気がつきにくいかも。中間クラスが別のファイルになっていたりすると、 > なんでこうなるのか分からないかもね。 そうですね。落とし穴だと思います。 僕も、一瞬グローバル関数が呼ばれるのだと思ってしまいました。 グローバル関数はObjectクラスに属していることを思い返せば納得ですが。 # これはいい試験問題になりそう。 > 結論としては、「トップレベルで作った関数のご利用は控えめに」ということか > も。 いやぁ、僕はグローバル関数よく使います。 わざわざクラスを作るまでもない小さいスクリプトをよく書くので。 クラス定義しない「使うだけのオブジェクト指向プログラミング」も受け付けるのが Rubyの好きなところのひとつです。 メソッド名の重複チェックはあおきさんのrdefs.rbや、rcodetools同梱の rct-meth-argsでどうぞ。 rdefs.rbはソースコードを静的に解析し、定義部分を抜き出します。 rct-meth-argsはスクリプトを実際に実行して、Module#define_method等の 動的メソッド定義に対応しています。依存しているライブラリのメソッドをも 抜き出します。ただし、ちょっと遅いです(^^; http://i.loveruby.net/svn/public/bin/trunk/rdefs.rb http://eigenclass.org/hiki/rcodetools $ rdefs.rb tmpdir.rb class Dir def Dir::tmpdir def Dir.mktmpdir(prefix_suffix=nil, tmpdir=nil) $ rct-meth-args tmpdir.rb FileUtils#pwd (...) FileUtils#cd (dir, options = {}, &block) FileUtils#uptodate? (new, old_list, options = nil) FileUtils#mkdir (list, options = {}) FileUtils#mkdir_p (list, options = {}) 略 FileUtils::DryRun#makedirs (*args) FileUtils::DryRun#copy (*args) extend FileUtils::DryRun <- FileUtils::DryRun Dir.tmpdir (...) Dir.mktmpdir (prefix_suffix = nil, tmpdir = nil) P.S. ところで、僕の手元にファイル名や行番号も出力するなどの拡張を施した rdefs.rbがあるのですが、再配布はokでしょうか?それとも、パッチを送りま しょうか? EmacsでRubyスクリプトを読むときに愛用しています。ファイル名や行番号も出 力すると、rdefs.rbの出力からソースコードの該当場所までジャンプしてくれます。 $ rdefs.rb -h rdefs.rb [-nH] [-r REGEXP] file... -n, --lineno Prints line number. -H, --with-filename Prints filename. -P, --with-prefix Prints prefix. --help Prints this message and quit. -r, --regexp=REGEXP Print lines matching REGEXP additionally. -t, --tab-width=TAB-WIDTH Tab width. $ rdefs.rb -nH tmpdir.rb tmpdir.rb:9: class Dir tmpdir.rb:32: def Dir::tmpdir tmpdir.rb:92: def Dir.mktmpdir(prefix_suffix=nil, tmpdir=nil) -Pをつけると、grepやanything.elで特定のクラスに属する定義のみを抜き出すことも。 $ rdefs.rb -nHP tmpdir.rb tmpdir.rb:9: class Dir tmpdir.rb:32: class Dir / def Dir::tmpdir tmpdir.rb:92: class Dir / def Dir.mktmpdir(prefix_suffix=nil, tmpdir=nil) -- rubikitch Blog: http://d.hatena.ne.jp/rubikitch/ Site: http://www.rubyist.net/~rubikitch/