11/16(木)、会津大学さんにて、授業の一環で出張Scalaハンズオンを実施させていただきました! ハンズオンの様子をレポートします。
あいさつ
こんにちは! オプトテクノロジーズ 採用担当の井上です。鍋と日本酒がより一層美味しい季節になりましたね。
日本酒醸造でも近年知名度を上げている会津に出張してきたので、レポートをお届けします(ちなみに笹政宗が好きです)。
会津大学さんへ出張してきました
11/16(木)、会津大学の授業(課外プロジェクト)の一環として、オプトのエンジニアcedretaber、lagénorhynqueによるScalaハンズオンを実施する機会をいただきました。
Opt Technologiesとして初の試みとなったハンズオン当日は、学部1〜2年生の方を中心とした、意欲ある学生の皆様にご参加いただきました。
Scala入門ハンズオン (by cedretaber & lagénorhynque)
今回のハンズオンは、RubyとJavaScriptでWebアプリケーションを学んでいる1・2年生が対象ということもあり、標準以外のライブラリにあまり依存しないコマンドラインアプリケーションの製作を課題としました。
講義の前半でScalaの特徴、基本的な文法等について解説し、手を動かしてもらいながらScalaについて知ってもらいました。
後半では、題材となるアプリケーションの作り方について「関数型らしさ」に留意しながら説明し、お手本を見ながら実装してもらいました。
www.slideshare.net www.slideshare.net
具体的には、以下のような内容を扱いました。
プログラミング言語「Scala」
Scalaとはどのような言語なのか、概説します。
JVM
ScalaはJVM (Java仮想マシン; Java virtual machine)上で動作する言語(JVM言語)のひとつです(ほかにGroovy, Clojure, Kotlinなどがあります)。
VMの上に構築された言語なので"Write once, run anywhere"というJavaの標語に象徴されるように移植性が高いのも特徴となっています。
また、Javaと相互運用可能なため、ライブラリやツールなどJavaエコシステムの資産を有効利用できるという強みもあります。
オブジェクト指向・関数型のハイブリッド言語
Scalaはオブジェクト指向プログラミングと関数型プログラミングの要素を統合したハイブリッドな言語です。
オブジェクト指向言語としての側面:
- フィールドとメソッドを持つクラス
- 継承とそれによるポリモーフィズム
- etc.
関数型言語としての側面:
- イミュータブル(変更不可能)なデータ構造
- 再代入不可能な変数
- パターンマッチ
- 文指向ではなく式指向
- etc.
Scalaの基本文法
Scalaの基本的な文法を紹介します。
値とリテラル
RubyやJavaScriptでもお馴染みの数値、文字列、真偽値のリテラルのほかに、以下のようにコレクションの値をリテラルのように書けます(実際にはメソッド呼び出しの糖衣構文を利用しています)。
変数定義
val
で宣言した変数は再代入不可能ですが、 var
で宣言した変数は再代入可能になります。
型アノテーションは : 型
という形式で変数名の後ろに付けます。
制御構文
Scalaの if
はRubyと同様に文(statement)ではなく式(expression)であるため、それ自体が値を返し、結果をそのまま変数に代入することができます。
yield
のない for
式は foreach
メソッド、 yield
のある for
式は map
(と flatMap
)メソッドの呼び出しに相当します(機能的にはPythonのリスト内包表記によく似ています)。
パターンマッチ
match
式などで使われるパターンマッチという機能によって、値を組み立てる時に利用したのと同じような形式で値を分解し、条件分岐を表現することができます。
メソッドと関数オブジェクト
def メソッド名(引数): 戻り値の型 = 本体
でメソッドを定義することができます。
(引数) => 本体
で関数オブジェクト(いわゆる「ラムダ式」。JavaScriptでいうfunction式/アロー関数式)を作ることができます。
また、関数の型は (引数の型) => 戻り値の型
という形式で表現します。
関数オブジェクトも値の一種なので、メソッドの引数として渡すことができます。
map
メソッド(高階関数)
関数を引数に取ったり戻り値として返したりする関数を「高階関数」と呼びます。
例えばJavaScriptやRubyでもお馴染みの map
メソッドは、コレクションの個々の要素に引数で受け取った関数を適用した結果のコレクションを返します。
平均値を表示するCLIツールを作ってみよう
ここまでで学んだことを利用して、数値リストの平均値を計算する簡単なコマンドラインツールを作ってみます。
scalaコマンドとsbt
以下のように main
メソッドを持つオブジェクトを定義すると、
次のようにscalaファイルとして scala
コマンドから実行することができます。
同様のことは、Scalaのビルドツールsbtを起動し、 compile
コマンドでソースをコンパイルし、 run
コマンドで実行することによっても実現できます。
コマンドライン引数を取り扱う
Scalaではコマンドライン引数が main
メソッドに文字列の配列(Array
)として渡るので、例えば以下のように書けば for
式でコマンドライン引数を1個ずつ標準出力することができます。
標準入力から読み取る
scala.io.StdIn
には標準入力を扱うのに便利なメソッドが定義されています。
readLine
メソッドを利用すると、標準入力から1行読み込んで文字列として受け取ることができます。
指定した区切り文字で文字列を分割するには split
メソッドが利用できます。
ここでは、標準入力から受け取った空白区切りの文字列を split
で分割し、個々の要素を標準出力しています。
文字列を数値に変換する
String
型の値に対する toInt
メソッドで Int
型に、 toDouble
メソッドで Double
型に型変換することができます。
講師からのコメント (by cedretaber)
時間の関係で課題を完全に作りきってもらうことはできませんでしたが、Scalaの紹介は概ねできましたので、演習で普段扱っている動的型付け言語や、他の授業で使っている手続き型・オブジェクト指向の言語とは違った、Scalaの魅力を知っていただけたかと思います。
TAの方も自信を持っていらっしゃった通り、学生さん達のレベルは高く、初めて扱うであろう言語にもすぐに馴染んでくれました。
演習ではRubyとJavaScriptを使っていたらしいのですが、それらの言語にある map
メソッドからScalaの map
メソッドの動きを類推したり、言語の型付の差異から来る違いに言及するなどして、比較的程度の高い学習ができたかと思います。
御礼
今回のハンズオン実現にあたり、多大なるご支援を賜った会津大学 データベースシステム学 上級准教授の渡部 有隆様、参加・サポートしてくださった学生の皆様、ご縁を繋げてくださった方に、改めて御礼申し上げます。
また、ハンズオンの内容については、オプト技術顧問の中村学氏の助言・協力を得て構成しました。
最後に
Opt Technologiesによるハンズオンをご希望いただける学校関係者の方は、こちらまで、是非お気軽にお声掛けください!
Opt Technologiesでは現在、中途採用に加え、2018・2019年度新卒採用についても、各種採用イベントを中心に活動中です。