Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

Scala 3はScala 2の標準ライブラリを使っていたりする

先日Scalaわいわいランド(ScalaのコミュニティDiscordサーバ)で、Scalaを最近勉強しだしたという方から

Scala3を使っていて気づいたんですけど、Scala2で記述されたライブラリを呼んでいる部分があることに気づきました

という話を聞いた。言われてみれば、Scala 3のリファレンスを読んでいるときも、ソースへのリンクを踏むとScala 2.13のソースコードに飛ばされてなんじゃこりゃ、と思っていた。

・・・という話を会社で id:tarao に訊いたところ、普通にScala 3はScala 2の標準ライブラリを使っているとのことだった。

話を詳しく聞くと・・・

  • Scala 3はScala 2の標準ライブラリを使っている
    • Scala 3独自の機能(Mirrorなど)はScala 3のリポジトリに置いてあり、Scala 3のコンパイラはこれを使っている
    • 一方、コレクションなどはそのままScala 2のライブラリを流用しており、これらのソースコードはScala 2のリポジトリに置いてある
      • scala/scalaに収められている

とのことだった。分かってしまえばそんなに難しくない。使う側はあまり気にしなくてよい。

どうしてこういうことができるのか

実は、Scala 2と3は相互運用できます。

  • ソースコードレベル
    • 文法が改善されているが、大部分はそのまま使える
  • クラスパスレベル
    • Scala 3コンパイラ(dotty)はScala 2のライブラリを読める
    • 逆に、Scala 2コンパイラはScala 3のライブラリを読める(コンパイラオプション-Ytasty-readerで対応させる)

docs.scala-lang.org

Scala 3を学ぶにあたってScala 2も学んだほうがいい?

前述の通り、文法レベルでは一部を除いてはたいした変化がないので(usingimplicitの違いが一番大きい差分だと思います)、Scala 3をやりたいからといってScala 2の文法が必須になるとは思っていません。

ただ、Scala 3からScala 2のライブラリを呼び出せることから、ライブラリの動作を詳しく把握しておきたい、という場合は読めたほうが良いと思いますが、 普通にこれからScala 3勉強するよ〜という場合は、気にしなくて良いと思います。気になったら勉強するで十分よいです。

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?