CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
前号での予告通り、Ruby生誕20周年を記念して2013年2月24日にRuby2.0がリリースされます。先日行われたDevelopers Summit 2013の講演にてRubyのパパであるMatzこと、まつもとゆきひろ氏が「乞御期待」と発表されております。
次号以降でRuby2.0での新たな機能や変更点をご紹介できればと思っています。
今回は二十歳となったRubyの成人を記念して、という訳では無いのですが、Rubyの中でも一等不可解な「特異クラス」の話をしたいと思います。
特異クラスは、生成したインスタンスに特異メソッドを追加できる機能と考えることが出来ます。つまり特異メソッドは特定のインスタンスだけで利用出来るメソッドなのです。
| class Foo; end | class Bar < Foo; end | | bar_obj = Bar.new | | class << bar_obj | def eigen_method | puts "eigen method called." | end | end | | bar_obj.eigen_method #=> "eigen method called." | | bar_bar = Bar.new | bar_bar.eigen_method #=> (NoMethodError)
Rubyでは特定のインスタンスだけに機能追加が可能なのです。
これが特異メソッドであり、実現しているのが特異クラスです。
次に基本に戻って再度、特異クラスを考察してみます。
オブジェクト指向言語は、データ(属性)と操作(振る舞い)をひとまとめにすることによって恩恵を得ようとするものです。
ひとまとめにするためには、クラスの定義を行い、それを雛形に実際に操作する対象となるインスタンスを生成します。Rubyも同様ですが、前述を踏まえてRubyでのクラス定義について振り返ります。
→ メソッドはクラス(モジュール)に属しています。
→ インスタンスメソッドはクラスにありますね。
→ ですからクラスから生成されたすべてのインスタンスで呼び出せます。
→ では、クラスメソッドはどこにあるのでしょう?
| class << Bar | def class_method | puts "class method." | end | end | | Bar.class_method #=> "class method."
→ クラスメソッドは(インスタンスではなく)クラスから呼び出します。
→ メソッドはどこかのクラス(モジュール)に属しています。
→ 見てのとおり、クラスメソッドはクラスの特異メソッドなのです。
→ そして、特異メソッドは特異クラスにあるはずです。
→ クラスメソッドはクラス自身の特異クラスにあることになります。
eigen: eigen class (特異クラス)
super: super class (スーパークラス)
特異クラスと継承の関係について図示を試みたものが上記となります。
図を眺めることで些少イメージが出来るかとも思われます。
賢明な方々はこの説明で更なる疑問点が湧いてきたかもしれませんが、その話はまたいつか機会があればつづく(かもしれません)。
ところで『特異』から連想される『よだかの星』という話があります。
よだかは、容姿が醜いために、仲間の鳥から蔑まされ、嫌悪されます。
よだかの兄弟には、「はちすずめ」と「かわせみ」という容姿が美麗な弟達がいます。それ故によだかは、更なる劣等感に苛まれます。
容姿だけでなく、生きるために羽虫を殺生することにも嫌気を感じています。
更に追い討ちをかけるように、横暴な鷹がやってきて難癖をつけます。
よだかは、居場所を失ったと思い込んでしまいます。
特異であることは、他と違うということであるが故に、凡庸のそれらから見れば異質でありましょうが、決して劣っているのではありません。市井の人の中には往々にして周りと横並びになることで周囲と同化したと勘違いし、同じ風体であることで安心感を得る、それも良いでしょう。
しかしながら、特異と呼ばれる程、他とは異なっていることこそ優位であり、価値があるといえましょう。特異であるために周りに揶揄され怯えるのでなく、むしろ異なることを誇りとして持ち得ることで、堂々と胸を張って歩きたいものです。異形である程に特異で有り得るのは困難であり素晴らしいことなのです。
よだかは、力強く自力で天高く舞い上がり、そして燐の如く青い美しい光となって輝き続ける美しい星になったのですから。
次回もお楽しみに。
>> Rubyの関連コース一覧
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes