IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

RubyビギナーのためのStep upコラム

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  OpenStack  システムトラブルシュート 

第4回 Rubyの動的型について (中越智哉) 2018年5月

みなさん、こんにちは。

前回はRubyの「キーワード引数」についての話題でしたが、今回もまたまた引き続きRubyの文法にフォーカスした話題「動的型」についてです。

「動的型」という言い方をしますと、動的型でない型定義があるのでしょうか?と思われる方もいらっしゃるかもしれませんので、まずはその分類からお話ししましょう。

いわゆる型定義の考え方には、大きく分けると「静的型」と「動的型」があります。

「静的型」は、簡単に言えば、プログラムのコード中であらかじめ変数やメソッドの引数、戻り値の型などを宣言しておくやり方のことをいいます。プログラムを記述した時点で、型名が明記されていて、プログラムの実行の段階になって、その明記された型が別のものに変化してしまうようなことがないため、「動きのない型」というような意味で、静的型という呼ばれ方をしています。静的型を採用している代表的な言語としては、C・C++・Javaなどがあげられます。静的型言語は実行前にプログラムにおける型の整合性をチェックすることが可能なため、実行時に型の不一致でエラーになりにくいプログラムにすることができたり、プログラマが何を代入したり何を渡せばよいかが比較的明確なため、大規模(開発に関わる人の数が多い)なシステム開発には静的型言語が向いているともいわれています。また、静的型は古い言語にのみ残っているものというとらえ方をされがちですが、最近では、TypeScript(ECMAScriptのMicrosoftによる独自拡張言語)のような比較的新しい言語でも、コード中での型宣言が可能になるなどの動きもあります。

対して「動的型」についてですが、こちらは、字面のとおりに想像すれば、型をいわば動的に決めるやり方ということになりそうです。しかし「決める」と言ってしまうと、どこかのタイミングで決定して、それ以降はその型がずっと使われる、ように思えてしまうかもしれないですね。動的型の場合は、どちらかといえば「型を決める」というより「型が何であるかの判断は、実行時にその値が何の型であるかによって行う」と言ったほうが良いかもしれません。近年のプログラミング言語では動的型を採用している言語は多く、Rubyをはじめ、PHP・Python・JavaScriptなど、いわゆるLightweight Languageといわれる言語の多くが動的型を採用しています。そのため、Rubyを通じて動的型を学んだという方は、もし他の言語を学ばれる際にもその考え方は比較的スムースに応用できるはずです。

では、Rubyでの動的型の様子を確認してみましょう。Rubyの場合は型は基本的にクラスを示していますので、変数・リテラルに対して「class」メソッドを実行すると型名(クラス名)を得ることができます。

たとえば、ある変数に100(整数)代入してclassメソッドを実行すると、「Fixnum」というクラス名が返ります。

fig01

続けて、同じ変数に"Ruby"(文字列)を代入してclassメソッド実行すると、「String」というクラス名が返ります。このように、Rubyでは実行時の実際の値に合わせて型を判断できるようになっているわけです。

しかしながら「動的型」という言葉を聞くと、型の扱いが柔軟であるがゆえに、判断が適当、すなわち、型が合わなくても大したチェックもされずにそのまま使えてしまうのではないか?と思ってしまう方もいらっしゃいます。

Rubyはどちらかというと、これはエラーで止まってしまうのではないか?と思うような場面でも、柔軟に解釈して実行してくれたりすることが確かにありますので、型の扱いについても同じように思えてしまうかもしれないですね。

ですが、実はRubyでは(当たり前ですが)型の扱いを適当に判断していることはなく、むしろ、柔軟に解釈できてしまいそうな以下のようなコードはエラーとなります。

fig02

期待する動作は、文字列と整数を連結して「I'm 18 years old.」のように表示することなのですが、ご覧の通り「TypeError」が発生します。実際のところ、これは「+」がメソッドとして実装されているので、メソッドで型をチェックしているが故の挙動ではあるのですが、動的型だからといって型を適当に扱っているわけではない、という例としてご紹介させていただきました。

また、メソッドに関していえば、前回のコラムでご紹介した以下のようなコード

def printDay(year,month,day)
   puts "#{year}#{month}#{day}日"
end

を見てもわかるように、メソッドの引数には型名を記述していませんし、戻り値の型に関する記述もないことが分かります。

ただ、引数に型がついていないと、何でも渡せてしまうし、逆に何を渡せばいいのか、と迷ってしまうかもしれませんね。

Rubyのような動的型の言語では、Duck Typingという型付けの考え方があるのをご存知でしょうか。「Duck」は「アヒル」のことですが、いわば「アヒルのように歩き、アヒルのように鳴くものはその正体がなんであるかにこだわらず、アヒルとみなしてよい」というものです。静的型言語のように、事前には型は限定されていませんが、期待される動作ができうるオブジェクトであれば、何でも渡せてしまうのが動的型言語の面白いところであり、柔軟な部分でもあるのです(もちろん、期待される動作が本当にできない場合は、エラーになります)。

このコラムを読んでいる方の中で、自分は静的型の言語を最初に学んだという方がいらっしゃれば、もしかするとRubyのような動的型の書き方、使い方がどうも心配だったり、もやもやするかもしれません。何を隠そう、私も最初はそうでした(笑)。でも、徐々に慣れていくと思いますので、ぜひ静的型、動的型それぞれのメリットを考えながら、Rubyを使いこなしていきましょう。

以上

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  OpenStack  システムトラブルシュート