Ruby で alias_method の元の名前を取得する

RUbyalias_method した元の名前を取得したい場合 Method#original_name で取得することが出来ます。

class X
    def homu
        "homu"
    end

    alias_method :mami, :homu
    alias_method :mado, :mami
end

x = X.new
p x.method(:homu).original_name
# => :homu
p x.method(:mami).original_name
# => :homu
p x.method(:mado).original_name
# => :homu

[おまけ]

また、標準ライブラリも alias されているなら同様に取得することが出来ます。

p [].method(:to_s).original_name
# => :inspect

Ruby の binding オブジェクトからローカル変数にアクセスする

Binding#local_variable_get でローカル変数にアクセスする事が出来ます。

def func a, b
    add = a + b

    # このメソッド内のコンテキストを返す
    binding
end

context = func 1, 2

# #local_variable_get でコンテキストの変数を取得する
p context.local_variable_get(:a)
# => 1
p context.local_variable_get(:b)
# => 2

# もしくは #eval を経由してもよい
p context.eval("add")
# => 3

Ruby の binding オブジェクトと eval()

Ruby では現在のスコープのコンテキストを bindig オブジェクトとして扱う事が出来ます。

def func a, b
    add = a + b

    # このメソッド内のコンテキストを返す
    binding
end

p func 1, 2
# => #<Binding:0x00000000c0fe18>

[binding オブジェクトと #eval()]

bindig の利用方法はいくつかありますが、#eval() で使用するのがわかりやすいです。

def func a, b
    add = a + b

    # このメソッド内のコンテキストを返す
    binding
end

context = func 1, 2
# eval 内で func の変数などが参照できる
p eval("add + a + b", context)
# => 6

このように eval() 内で指定した binding のコンテキストを参照する事が出来ます。

Vim 8.0 で追加された関数 funcref()

Vim 8.0 で新しく funcref() という関数が追加されました。 これは function() と同じように関数参照を取得する関数になりますが、『関数が上書きされても元の関数を呼び出す』という違いがあります。

function! Test()
    return "Test"
endfunction

let Function = function("Test")
let Funcref  = funcref("Test")

echo Function()
" => "Test"
echo Funcref()
" => "Test"

" 関数を上書きする
function! Test()
    return "new Test"
endfunction

" function() は上書きした関数を呼び出す
echo Function()
" => "new Test"

" funcref() は元の関数を呼び出す
echo Funcref()
" => "Test"

上書きされる可能性がある関数の参照を取得したい場合は funcref() を使用したほうが安全かもしれません。

Boost 1.62.0 がリリース

最近はあまり Boost も触っていないが Boost 1.62.0 がリリースされたらしい。
今回は新しく以下の2つのライブラリが追加された。

両方共、昔から提案はされていたもののなかなか組み込まれなかったので、今回追加されたのは感情深い。