メタプログラミングを使って docstring 機能を Ruby 言語に導入したいと考えています。
これは、私がこれまでに書いたコードの非常に初期のプロトタイプです。
module Docstrings
def doc(docstring)
@docstrings ||= {}
if docstring.is_a? String
# Ruby 2.0 trick to get a caller of the method
method_caller = caller_locations(1,1)[0].label.to_sym
@docstrings[method_caller] ||= docstring
else
@docstrings[docstring]
end
end
end
# lets include it temporarily to see how it works
include Docstrings
class Method
include Docstrings
end
doc "Hello"
puts doc :"<main>" # => "Hello"
できます。しかし、悲しいことに:
def square(x)
doc """This method returns square of x"""
x * x
end
doc(:square) # => nil
これは私が期待したように機能していません。
square(2)
doc(:square) # => """This method returns square of x"""
明らかなように、メソッド square が少なくとも 1 回呼び出された場合にのみ、docstring が追加されます。
私の質問は、そのメソッドの呼び出しではなく、メソッドに docstring を追加する方法で実装することは可能ですか? 解決策ではないヒントを探しています。どこを見ればよいか教えてください:)