トップ «前の日記(2006-01-09 (Mon)) 最新 次の日記(2006-03-21 (Tue))» 編集 RSS feed

継続にっき

2004|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|12|
2006|01|03|05|06|08|09|10|12|
2007|01|02|03|05|07|12|
2008|10|
2009|01|05|12|
2010|04|05|11|
2011|01|09|12|
2012|02|03|05|09|12|
2013|02|03|
2014|05|09|
2015|12|
2017|09|

2006-03-19 (Sun)

))) Hikiでプラグイン関数のエイリアスを定義するには

Hikiのプラグインファイルの読み込みは単純に書くと次のようになっているようだ。

plugin = Hiki::Plugin.new
plugin.instance_eval(File.read(plugin_file))

つまりプラグインファイル中でのメソッド定義はPluginオブジェクト(ここではplugin)の特異メソッドとなると 言うことだ。このうちexport_plugin_methodsされたものだけがHiki上からユーザーが利用できる。 このことからプラグイン関数のエイリアスを定義するには

  1. 特異メソッドのエイリアスを定義して
  2. それらをexport_plugin_methodsする

という2つのステップを踏めばよいということが分かるので、それをplugin/99alias.rbなどにでも書いてみる。

alias ref_image attach_view
export_plugin_methods(:ref_image)

動的にやってみる(あるいは、Rubyで特異メソッドの別名を動的に定義する方法)

上の例でref_imageが2カ所にあるのをまとめたいとする。export_plugin_methodsは各プラグインファイル中で 1回しか呼べないので、次のような定義の仕方になるだろう。

def plugin_method_aliases(*pairs)
  pairs.each do |n, o|
    class <<self
      self
    end.module_eval { alias_method n, o }
  end
  export_plugin_methods(*(pairs.map {|n,| n}))
end

plugin_method_aliases [:ref_image,  :attach_view],
                      [:new_method, :old_method ],
                      ...

pairs.eachのブロック部分について。素直に

class <<self
  alias_method n, o
end

と書きたいところだが、特異クラス定義中ではまわりの環境(ここではnとo)が見れないので 若干トリッキーになっている。が、ここまでやるなら eval("alias #{n} #{o}") しろって話も……。


2004|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|12|
2006|01|03|05|06|08|09|10|12|
2007|01|02|03|05|07|12|
2008|10|
2009|01|05|12|
2010|04|05|11|
2011|01|09|12|
2012|02|03|05|09|12|
2013|02|03|
2014|05|09|
2015|12|
2017|09|
トップ «前の日記(2006-01-09 (Mon)) 最新 次の日記(2006-03-21 (Tue))» 編集 RSS feed