1日目の記事になります。実装してみたいと思います。この記事の実装は以下の記事を参考にして書いています。Qiita4年以上前にこういうのが書かれていたのすごい。parameter、略してナンパラです。ナンパラは『暗黙的にブロックの引数を参照する構文』になります。通常ブロックで引数を受け取る場合、仮引数を定義して受け取ります。いう記号で『暗黙的に第一引数を参照する』事が出来るようになります。使用することが出来ます。コードを記述する事が出来ます。実装してみたいと思います。現在でも変数名やメソッド名などで使用することが可能です。使用した場合は警告が出るようになったので注意して下さい。意図する動作はしないので注意して下さい。動作イメージまず簡単な動作イメージを考えます。参照することを想定しています。どこで定義するのかブロックの中身を評価するコンテキストはどこになるのかそれをどうやって既存のメソッドに適用させるかあたりでしょうか。1つずつ実装していきましょう。これは次のようなクラスとして定義しておきます。"mado"これ自体はとてもシンプルですね。いうメソッドをナンパラのように呼び出してみます。いうとても便利なメソッドが定義されています。してブロックを実行する』というメソッドになります。いうことかよくわかりませんね。実際の使用例を見てみましょう。コンテキストでブロックを実行する事』が出来ます。クラスを組み合わせることでナンパラのようなブロックを実行する事が出来ます。"homuhomu"もうナンパラじゃん!!!と、いう感じでブロック内でナンパラっぽい構文を書くことが出来るようになります。やったー!!!さて、ここからちょっとコードを整理してきます。一つずつ定義しています。まで動的にメソッドを定義するようにします。みたいに呼び出すのはちょっとつらいですね。新しいメソッドを定義してもう少し使いやすくしてみましょう。使ってメソッドを定義します。拡張すると以下のようになります。使えるように拡張できるような仕組みを考えていきたいと思います。使ったブロックを評価できるようにする事を考えてみましょう。2点を実装すると以下のようになります。使用することで既存のメソッドを上書きすることなくメソッド呼び出しに処理をフックすることが出来ます。使えるようにしていきます。することで既存のメソッドをナンパラ化することができました。既存のメソッドをナンパラ化するようなヘルパメソッドを定義してみましょう。イメージとしては以下のような感じです。クラスのインスタンスメソッドを定義します。いうメソッドを追加します。"424242"ちょっと複雑ですがこんな感じで実装する事が出来ます。155もうナンパラじゃん。簡単にクラスをナンパラ化できるようにするほぼ完成なんですが、最後にもっと簡単に安全にクラスをナンパラ化する仕組みを考えてみましょう。先程の例であれば以下のようにして任意のクラスをナンパラ化することが出来ます。参照している場所全てに影響を及ぼしてしまいます。これはよくないですね。そこで以下のような仕組みで『特定のコンテキストでのみナンパラ化』してみます。任意のクラスをナンパラ化することが出来ます。利用してナンパラ化しているので次のように『任意のコンテキストでのみ』ナンパラ化することが出来ます。}もう最強じゃん...。最終的に出来上がったもの最終的に出来上がったものがこちらになります。50行でナンパラっぽいものを実装することが出来ました。拡張するコードも含まれているのでナンパラ自体の実装は30行ぐらいしかありません。楽しいところですよねー。ナンパラとの違いを説明しておきます。考慮した情報を返します。取得することは出来ません。いう風に受け取ります。以上を使用してれば配列を展開して』受け取りますた。2]しかし、今回作成したものは可変長引数として受け取っているためです。っぽい機能を実装してみました。50行ぐらいの実装でそれっぽいものをつくることが出来ました。コードレベルでこういうことを実現することができるのがとても面白いですね。して公開してあります。3年以上前に書いたものになります。基本的な使い方は今回書いたコードとだいたい同じなんですが実装は結構違っているので気になる方は実装を読んでみると面白いかもしれません。いった値にも参照することが出来ます。そのため『自身を呼び出した再帰処理』を記述する事が出来ます。実装されるのは感慨深いものがありますね。ナンパラは簡単そうにみえて実は結構癖が強いので実際使われてみてどうなるのかは気になりますね。リリースまでもうすぐですが果たして無事にナンパラをリリースする事が出来るのか...。12日目の記事になります。ゴーストメソッドを書いてみた。メソッドを多重定義するためのライブラリをつくったまあつくったのは結構前なんですが、つくりました。(1)はてなブログをはじめよう!osyo-mangaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。