読者です 読者をやめる 読者になる 読者になる

Ruby で static 関数のようなものを定義したかった

C 言語の static 関数ような『そのファイルのみで参照できる関数』を Ruby でも定義したかったのですが、そういう機能はないみたいなのでちょっと考えてみました。

[コード]

def static_def name, &block
    name = caller.first[/([^:]+):/, 1] + name.to_s
    define_method(name, block)
end
 
def static_send name, *args
    name = caller.first[/([^:]+):/, 1] + name.to_s
    send(name, *args)
end
 
 
static_def(:homu){ |n|
    puts "homu:#{n}"
}
 
static_send :homu, 10
# => homu:10

コールスタックから呼び出された箇所のファイル名を起点にしてメソッドの定義・呼び出しを行ってます。
方向性としてはこれでよさそうなのでもうちょい使い勝手をよくしてみたい。