
2025.02.12
職員一人あたり52時間の残業削減に成功 kintone導入がもたらした富士吉田市の自治体DX“変革”ハウツー
リンクをコピー
記事をブックマーク
中村学氏(以下、中村):まず自己紹介します。中村学と言います。「がくぞ」という名前でTwitterなどをブイブイやっているので、よかったらぜひフォローしてください。Tech to Valueという会社の代表と、あとはエフ・コードでCTOをやっています。
さっそく中身に入ります。Scalaは学習コストが高いと言われることがあります。多言語からの経験から、けっこう推測しづらい言語機構があったりするので、この辺がけっこうとっつきにくいと感じる方がいるようです。
他の言語では専用で用意されている構文のようなものが、Scalaだとシンプルな機能を組み合わせることで実現されています。組み合わせで実現できることがすごく増えるので、あたかも機能がいっぱいあるかのように見えてしまい、とっつきづらく感じることがあったりします。
そのへんがあるので、このセッションでは、最初に知っておくとよさそうな構文と、言語機構について説明したいと思っています。
まずはブロック式について話をします。ブロック式って、みなさんご存じですかね? ブロック式の説明の前に、そもそも式とは何でしょうか。式そのものの形式的な定義は言語仕様に書いてあります。しかし、それを見るとちょっとわかりづらかったので、ザックリ語弊もあるかと思いつつ言うと、Scalaにおいて式は“プログラムの実行における一番基本的な要素”です。
どういうことかと言うと、その文字列リテラルのfooとか、あるいは1+2+3のような、普通のメソッド呼び出しのようなものも全部式です。最近の言語にはよくあるんですが、 if も式になります。
式とは何かを一番端的に表しているのが、他の言語だとよく“実行”とも言われる“評価”で、そのプログラムの中の書かれている部分を評価して、成功すると値になるものが式です。Stringや文字列リテラルであれば、それがStringのインスタンスになりますよね。あるいはその1+2+3のようなメソッドの呼び出しがあると、普通に計算されて、評価が成功すると6になり、これが、いわゆる式と言われるものになります。
式じゃないもの、評価をしても値にならないものを文と言います。ステートメントと言われるものです。具体的に何かというと、変数宣言などのようなもので、val bar = "the value declaration is a statement"のような変数宣言は、評価しても変数が定義されますが、それ自体が何か結果を返すわけではありません。
例えば、throw new Exceptionのようなものも、実は式です。throwもthrow式ですが、throwは例外を投げるため、評価が必ず失敗します。評価しても値にならず、例外になる式です。
メソッド定義について見ていきたいと思います。メソッド定義そのもの自体はステートメント(文)ですが、メソッド定義の成り立ちは、defから始まってメソッド名が来て、その後ろに( )で引数リストが来ます。これが、引数の名前と型のリストです。その後ろにコロンで戻り値の型が来て、そのあとにイコールがあって、その右側に式が来ます。
メソッド定義は、基本的にはdefから始まり、大きくイコールで区切られる感じです。イコールの左側が、メソッド名や引数リスト、戻り値など、メソッドのシグネチャになるところ。イコールの右側に単一式を取ります。式の評価結果がメソッドの結果、戻り値になるような構造になっています。
完全なメソッドの定義のコードが、いわゆるここで足し算をするようなメソッドの定義です。def add(a: Int,b: Int)戻り値の型がIntで、右辺にa + bという式を書いている。これが完全なメソッドの定義ですが、ここにreturnも{ }もないことに注目してもらえると一番いいと思います。これはもう完全に、完璧なメソッド定義のかたちです。
時折りScalaのメソッド定義ではreturnが省略できるとか、{ }を省略できるという表現をすることがありますが、厳密にはちょっと正しくなくて。あくまで上記のイコールの右側に単一の式が来るのが一般的なかたちで、必要であればreturnや{ }も書いてもかまわないのが実際のところです。このニュアンスの違いわかりますか?(笑)。
ここが大事なところというか、僕が一番伝えたかったので。returnや{ }は省略ではないよ、というところです。
式はそのもの自体が評価されると値になるので、それ自体をまた式の一部として、大きな式を作れます。そのため、複雑な処理自体を単一式で表現することも、基本的には可能です。ただ、何回も同じ値を使いたいときや、何回も評価したい場合、あるいは処理の意図を宣言的に表現したい場合は、単一式であるより、式を分けたほうがわかりやすくなる場合がけっこうあります。
そこで、ブロック式が導入されます。ブロック式は複数の式や文をまとめて、1つの式としてみなすためのものです。ブロック式が評価されるときには、上から順番にその式が評価されて、最後の式の値、評価結果がブロック式全体の評価結果になる構造です。
さっき書いたような単一式でいろいろ呼び出しているような式も、calculate(foo)が2ヶ所に出てきていますが、ブロック式を使ってbazという名前を付けたり、calculate(bar)にquxと名前を付けたところに、最後のdoSomethingの呼び出しを式として書くことで、同じ意味を表せる感じです。
ブロック式を使うと、上のコードと下のコードが同じ意味合いになります。あくまでブロック式の最後の式自体が全体の評価結果になるので、そもそもreturnが省略されているわけではなく、単純にそういう構造ですよ、という感じです。ブロック式自体は、あくまでその式を束ねる、ただの式なので、メソッドとか関係なく、式が書ける場所だったらどこにでも置けます。
そのため、メソッド定義以外に、普通に変数定義のfooのところでブロック式を使ってもかまいません。これは普通にprintlnして、10+30の2つの式を組み合わせて、1つの式になっている。結果、定義時にprintlnされて、値としては40が代入されるかたちになります。
同じように、if式の条件式が合致するケース、あるいは条件が合致しないケースにも、単一の式が書けます。そのため、ifで{ }があるときとないときは構文上の違いがなく、あくまで条件の後ろ、elseの後ろにはには1つの式が来ますよと。
その式の中で複数のことをしたいのであれば、ブロック式を使えば単一の式としてみなされるので、他の言語にあるような、{ }付きの書き方も許容されます。
では、そもそもreturnとは何かというと、あくまでそのメソッドの中で、その評価の途中で脱出して値を決定したいときのための構文です。そのため、メソッド定義の外では使えません。変数定義のbarやフィールドを定義するときにブロック式を使ってreturn bazを書いても、そもそもメソッドの定義ではないので、コンパイルが通りません。
あくまでreturnを使いたいときは、メソッド定義の中でガード節などを作る一番先頭で、条件に合わなかったらこのメソッドの評価結果を決定したい、後ろの評価を打ち切って返したい、というような特殊なときにreturnを使います。それ以外のときはブロック式が全体の評価結果になるので、returnを使う必要はありません。
他の言語から移植して書くと、{ return a+b }のように書くことも可能で、これ自体を別に定義したところで、結果自体は同じになります。そのため、だいたい見逃されているというか、書けますが、あたかも他言語のforループやループ文の最後で、わざわざ明示的にcontinueを書いているようななことと同じ感覚です。
本来必要ないのに、あえて途中でreturnを入れているような感じなので、繰り返すとreturnは省略できるわけではなく、単純にその式の評価結果自体がメソッドの結果になるだけです。省略できると言うと、書いていなくても実際のプログラムの意味上ではreturnが補足されて扱われるような意味合いになってしまいますが、そうではなく、returnがないかたちが通常です。
まとめると、式は評価すると値になるプログラムの構成部品です。ブロック式は複数の式や文をまとめて1つの式にします。ブロック式は普通の式なので、式が置けるところにはどこでも置けます。returnやブロック式の{ }は省略できるわけではなく、必要であれば使用する感じです。
けっこう他の言語だと、メソッドの定義のときに、{ }があるパターンとないパターンが両方の言語仕様として複数定義されている。複雑にルールが定義されている場合があります。しかし、Scalaの場合、メソッドの定義としてはイコールの右辺に式が置ける、1つのシンプルなルールで成り立っています。その式の中にはブロック式という存在がある感じです。
メソッド定義のときに、{ }があるときと{ }がないときの両方を許容する言語に比べると、シンプルなルールで成り立っています。ここまでがブロック式の説明でした。
(次回につづく)
2025.02.13
“最近の新人は報連相をしない”という、管理職の他責思考 部下に対する「NG指示」から見る、認識のズレを防ぐコツ
2025.02.06
すかいらーく創業者が、社長を辞めて75歳で再起業したわけ “あえて長居させるコーヒー店”の経営に込めるこだわり
2025.02.13
AIを使いこなせない人が直面する本当の課題 元マッキンゼー・赤羽雄二氏が“英語の情報”を追い続ける理由
2025.02.12
マネージャーは「プレイング3割」が適切 チームの業績を上げるためのマネジメントと業務の比率
2025.02.12
何度言っても変わらない人への指示のポイント 相手が主体的に動き出す“お願い”の仕方
2025.02.14
報連相ができない部下に対するコミュニケーションの取り方 「部下が悪い」で終わらせない、管理職のスキル向上のポイント
2025.02.13
「みんなで決めたから」を言い訳にして仲良しクラブで終わる組織 インパクトも多様性も両立させるソース原理
2025.02.10
32歳で「すかいらーく」を創業、75歳で「高倉町珈琲」で再起業 「失敗したからすかいらーくができた」横川竟氏流の経営哲学
2025.02.13
上司からは丸投げ、部下からはハラスメント扱い、業務は増加…プレイングマネジャーを苦しめる「6つの圧力」とは
2025.01.07
1月から始めたい「日記」を書く習慣 ビジネスパーソンにおすすめな3つの理由
着想から2か月でローンチ!爆速で新規事業を立ち上げる方法
2025.01.21 - 2025.01.21
新人の報連相スキルはマネージメントで引きあげろ!~管理職の「他責思考」を排除~
2025.01.29 - 2025.01.29
【手放すTALK LIVE#45】人と組織のポテンシャルが継承されるソース原理 ~人と組織のポテンシャルが花開く「ソース原理」とは~
2024.12.09 - 2024.12.09
『これで採用はうまくいく』著者が語る、今こそ採用担当に届けたい「口説く」力のすべて
2024.11.29 - 2024.11.29
【著者来館】『成果を上げるプレイングマネジャーは「これ」をやらない』出版記念イベント!
2025.01.10 - 2025.01.10