2008年8月 7日

[ruby-list:45309] Re: グローバルにdefしたメソッドのスコープ

From: take_tk <ggb03124@xxxxx>
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/


投稿者 xml-rpc : 2008年8月 7日 04:29
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/76026
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。