Scalaの教え方

1か月前、最初の仕事を得て研修生開発者になりました。私たちのチームはScala言語を使用しています。 私にとっては、初日のすべての初心者開発者が失われているようです。 同時に、たくさんの新しい名前、テクノロジー、いくつかのルールが山積みになり、まったく新しいものが何なのか決してわかりません。これが最初の仕事です。 私の場合、インタビューを聞いたことがなかったので、プログラムする言語をまだ知りませんでした。 結論:最初の日、私は満員でした。 どのようにしてこの仕事を手に入れましたか? 私はJavaを知っていました、インタビューで私はジャビスタが非常に簡単に岩に行くことができ、あなたが心配することはできないと言われました。 しかし、どうやらイライラする価値があったようです。目の前で初めて、テキストでいっぱいの画面を見たので、その半分近くがすぐにわかりました。



しかし、私が何かを理解しなかったという事実でさえ不快感をもたらしましたが、多くの違いがあり、変数のタイプでさえ名前の後に来ており、時にはまったく存在しないという事実もあります。



final String str = "abc"; //Java
      
      





 val str = "abc" // Scala
      
      





これは、関数の記述方法です。



 int sum(int a, int b) {return a+b;} // Java
      
      





 def sum(a: Int, b: Int) = {a + b} // Scala
      
      





また、Scalaには、たとえばPythonのように、コンソールREPL(Read-eval-print-loop)もあります。 すでにお気づきのように、セミコロンはありません。 1ページのプログラムはメインなしで起動できます。メソッドと変数の名前には、すべての文字を含めることができます。ルールはありません。 静的ではありませんが、オブジェクトがあり、プリミティブオブジェクトもあります。==実際に等しいものがあります。 メソッドにパラメーターがない場合、メソッド呼び出しを終了する必要はありません。パラメーターがない場合は括弧もオプションであり、パラメーターが1つだけの場合は、次のように記述できます。



 str.charAt(5); // Java
      
      





 str charAt 5 // Scala
      
      





そして別の興味深い例:



 val res = 1 + 1
      
      





いいえ、1 + 1だけではなく、ここではオブジェクト1、+メソッドが呼び出され、オブジェクト1が唯一のパラメータとして渡されます。



私のショックに、デビッド・ポラックのすばらしい本がありました-Beginning Scala。 この本は1つのフレーズで始まり、その後、最後まで読む必要があることに気付きました。
痛い! それは私の脳を傷つけます! 私に違った考え方をさせないでください。 ああ、待ってください...今ではそれほど痛くありません。 わかった。 問題を解決するこの異なる方法には、いくつかの利点があります。 私はロースクールの最初の年の後にそのように感じました。 Scalaのコーディングを始めたとき、私はしばらくの間そう感じました。
デビッドはプログラミングの素晴らしい経験があり、私が生まれる20年前にこのビジネスを始め、Scalaに来るまで10以上のプログラミング言語で仕事をすることができました。 そして今、彼は言います:
Scalaは、開発者に世界最高のエクスペリエンスを提供するプログラミング言語です。
それにもかかわらず、著者はそれを習得するのはそれほど簡単ではないと正直に警告しています。これを行うには2年かかりましたが、彼は私たちがより速くできることを望み、これを手伝います。 これは非常に単純な本ではなく、読者とのプログラミングのいくらかの経験を含みます。 特に以前にJavaでプログラミングした人はそれが好きです。 この言語には多くの参照があり、比較することができます。



Beginning Scalaに加えて、TwitterのScala Schoolのレッスンも読みました。レッスンにはすべてロシア語への翻訳がありますが、David Pollackの本は英語版でしか見つかりませんでした。



Scala Exercisesプロジェクトは、岩と仕事の源を巡る独立した移動に加えて、理論を統合するのに役立ちました。非常に単純なタスクがありますが、最初にいくつかの側面を修正し、すべてを注意深く読んで理解したことを確認するのに非常に適しています。



そして、最初に理解しなければならなかった最も一般的で非常にシンプルなことについて少しお話しします。



オプション 一言で言えば-これは空(なし、nullのように見えますが、map、filter、...)メソッド、またはいくつかの値(値)があり、その使用によりコードがより安全になり、 NullPointerExceptionをスローしないのは、それが必要かどうかにかかわらず、Optionからクリーンなデータを抽出する必要があり、この時点でチェックを書くのを忘れることはすでに困難です。

もちろん、Optionにはgetメソッドがありますが、この場合はOptionの全ポイントが失われるため、このメソッドを使用することはお勧めしません。 None.getは例外をスローします。

最も明らかな設備のいくつか:



Optionが空の場合、デフォルト値を返すのは簡単です



 optValue.getOrElse(defaultValue)
      
      





アクションの場合:



 optValue match { case Some(value) => action case None => defaultAction }
      
      





Scala Beginningの例。 パスは、Personタイプを含む特定のデータベースです



 def findPerson(key: Int): Option[Person]
      
      





このようなエントリが見つかった場合、メソッドはSome [Person]を返し、それ以外の場合はNoneを返します。

次に、キーでユーザーの年齢を取得します。



 def ageFromKey(key: Int): Option[Int] = findPerson(key).map(_.age)
      
      





Noneをテストする必要はなく、メソッドは非常に簡潔であることがわかりました。



パターンマッチング 。 最初は、これは同じJavaスイッチであり、ほとんど使用しないと思いましたが、そうではありません。 Scalaでは、これは最も一般的に使用される設計の1つです。



型キャスト:



 obj match { case str: String => str case number: Int => number }
      
      





条件を追加して、デフォルトのアクションを追加できます。



 obj match { case strWithA: String if strWithA.contains("a") => strWithA case negative: Int if negative < 0 => negative case zero if zero == 0 => zero case _ => defaultAction }
      
      





ケースクラスでパターンマッチングを使用すると非常に便利です。 Scala Beginningの例



 Stuff("David", 45) match { case Stuff("David", age) if age < 30 => "young David" case Stuff("David", _) => "old David" case _ => "Other" }
      
      





機能



まず、Scalaでは、関数は特定のインターフェイスを実装するインスタンス、またはむしろFunctionXを実装するインスタンスです。Xはパラメーターの数で、1〜22の値をとります。このトレイでは、関数に対して呼び出されるメソッドはapllyのみです。 関数は通常のインスタンスであるため、メソッドや関数から渡すことができます。

Scala Beginningの例。 IntからStringに何らかの関数を応答で渡し、パラメーター42でこの関数の結果を返します。



 def answer(f: Function1[Int, String]) = f(42)
      
      





または何が同じですか



 def answer(f: Function1[Int, String]) = f.apply(42)
      
      





非常に便利なのは、機能的な組み合わせです/



配列には正の要素のみを残します。



 arr.filter(value => value > 0)
      
      





もう少し複雑な例。 リストの正の要素から関数fの値の合計を計算します。 2つの方法:



 list.filter(x => x > 0).foldLeft(0)(_ + f(_)) list.filter(x => x > 0).map(f).sum
      
      





そして最後に、なぜ私がこれをすべて書いたのかをお話したいと思います。 誰にもScalaを教えたり、言語について話したりしたくはありませんでした。そのような記事はハブやインターネット上にたくさんあり、多くは非常に有益で便利です。 私の目標は単純に私の話をすることでした。それは誰かにとって興味深いかもしれず、運命がこの岩に対して出会ったばかりの同じ失われた新参者の一部を助け、支援することができます。 幸運を祈ります! 経験豊富なプログラマーは、初心者のScalaプログラマーの道に関して、コメントでヒントや意見を共有することをお勧めします。



All Articles