JS DEVsのためのKotlin (その1 )


JavaScriptは驚くべき言語です:それが導入されたとき、それは「おもちゃの言語」であることから来ました — あなたは、ブラウザ上で実行することができますサーバー上では、モバイルアプリケーションを構築することができます — あなたは、JavaScriptを使用してNASAの宇宙船をプログラムすることができます.

それでも、1つ以上の言語を学ぶ機会があります — そして、私はキャリアの機会について話していない:デイビッドトマスとアンドリューハントとして古典的な本“実用的なプログラマ”と言う

Learn at least one new language every year. Different languages solve the same problems in different ways. By learning several different approaches, you can help broaden your thinking and avoid getting stuck in a rut.


要するに:JavaScriptは驚くべきですが、新しい言語を学ぶことは、強力なものです:それはあなたがプログラミングについて考える方法に影響を与える、あなたに新しい視点を与え、問題を解決する方法に影響を与える最終的にあなたに良いソフトウェア開発者を作る.

OK、しかしなぜKollin?



そこにプログラミング言語の何百もあるので、なぜKollin?よく、コリンは人気(そして需要)で急上昇していますそれは、そのユーザーに愛され、JavaScript開発者の大群を集めている.そして、それは私が言うことでありません:Githubのものstate of octoverse report それはプラットフォームで最速の成長の言語としてポイントKollin“State of Kotlin” report JavaScript開発者が新しいKotlin開発者の2番目に大きい「源」であることを示します.最後に、言語に対する愛情を“Stack Overflow inside” report .
空想の事実を脇に、Kotlinはあなたの次の言語のための偉大な候補となる多くの特性を持っています
  • これは、現代的な構文:エレガントな、簡潔で簡単です — あなたは物事を成し遂げるに焦点を当てることができます.
  • オブジェクト指向と関数型プログラミングは競合していないが、直交パラダイムであり、両方とも採用されている(この場合、実際にはJavaScriptとの類似性を共有する).
  • 多くのライブラリ、拡張と最適化が利用可能なAndroid開発のための公式言語です.
  • マルチプラットホーム — Kotlinの主なターゲットはJVM — クライアントとサーバアプリケーションの両方については、JavaScriptにWebやネイティブのバイナリに使用するようにコンパイルすることができます
  • 最後に、少なくとも、それを使用するのも楽しいです.

    クイックリファレンス(JSからKotlin)


    次のいくつかのセクションでは、Kabtlin言語の構文と意味の全体的な、鳥の目のビューがあります.もちろん、新しい構文と意味論で、新しい建物や物事を構築する方法が発生しますが、それら(または他のKotlinの詳細)に焦点を当ててみましょう — 新しい言語を学ぶための最良の方法は、あなたが時間がない(そして、このシリーズの次の記事のための時間で)より多くのために準備することができますので、すぐにそれを再生することです.

    変数と定数


    kotlin変数はvar キーワード.再署名を防ぐためには、val  — 両方のJavaScriptのような作品let and const .
    Kotlinは入力された言語です.つまり、コードに型注釈を追加する必要がある場合があります.ほとんどの場合、コンパイラは自動的に型を推論できます.

    ジャバスクリプト


    const name = "Jon Snow";
    let isAlive = true;
    let role; // Declared but not initialized
    

    小林


    // Types can be inferred from initialized variables
    val name = "Jon Snow"
    var isAlive = true
    
    // If the variable is declared but not initialized, a type annotation is required:
    var role: String
    
    


    単一および複数行の文字列


    ジャバスクリプト


    const house = "Stark";
    const motto = `
    Winter
    is
    comming
    `;
    
    

    小林


    val house = "Stark"
    val motto = """
    Winter
    is
    comming
    """
    

    文字列補間


    ジャバスクリプト


    const action = `Attacking using a ${weapon}`;
    
    const result = `Looks like you will ${user.getFate()}`;
    

    小林


    const action = "Attacking using a $weapon" 
    
    const result = "Looks like you will ${user.getFate()}" // curly brackets are only necessary to interpolate expressions
    
    

    関数


    関数


    Kotlinの機能は、Funキーワードを使用して宣言されます.各パラメーターに対して型注釈を追加する必要があります.

    ジャバスクリプト


    function double(num) {
        return num * 2;
    }
    double(2); // 4
    
    
    // Default values
    function shout(message, postfix = "!!!") {
        return `${message.toUpperCase()}${postfix}`;
    }
    shout("hey"); // HEY!!!
    

    小林


    fun double(num:Int) {
        return num * 2
    }
    
    // Default values
    fun shout(message: String, postfix = "!!!"): String {
        return "${message.toUpperCase()}$postfix"
    }
    

    パラメータ


    関数の呼び出し時に関数パラメータを指定できます.これは、関数が多くのパラメータまたは既定のものを持つときに非常に便利です.

    小林


    fun reformat(str: String,
                 normalizeCase: Boolean = true,
                 upperCaseFirstLetter: Boolean = true,
                 divideByCamelHumps: Boolean = false,
                 wordSeparator: Char = ' ') {
        ... 
    }
    
    reformat("SomeString", normalizeCase = false, divideByCamelHumps = true)
    

    関数式( lambda )


    ラムダ式は「関数リテラル」、つまり宣言されていない関数ですが、式としてそのまま渡されます.JavaScriptでは、それらは一般に「アロー機能」と呼ばれています.
    コールインでは、ラムダ式は常に括弧の括弧で囲まれており、完全な統語形式のパラメータ宣言は巻き括弧の中に入り、任意の型の注釈を持っています-> サイン.注意:コルトインのラムダの戻り値を指定できません.ほとんどの場合、自動的に推論できるので、これは不要です.

    ジャバスクリプト


    const double = (num) => num * 2; // Single line has implicit return
    
    const square = (num) => {
        const result = num * num;
        return result; // Multi line: No implicit return
    }
    

    小林


    val double = { num:Int -> num * 2 }
    
    val square = { num: Int -> 
        val result = num * num
        // The last expression in a lambda is always considered the return value:
        result
    }
    
    ラムダ式が1つのパラメータだけを持つことは、非常に一般的です.便宜として、コールリンはそれらに特別な扱いをし、自動的に名前の下に一つのパラメータを宣言します.

    ジャバスクリプト


    const carModels = cars.map((car) => car.model );
    const oldEnough = users.filter((user) => user.age >= 21 );
    

    小林


    val carModels = cars.map { it.model }
    val oldEnought = users.filter { it.age >= 21 }
    

    流量制御


    もし


    ジャバスクリプト


    if (number > 0) {
        console.log("Positive number");
    } else {
        console.log("Negative number");
    }
    

    小林


    if (number > 0) {
        print("Positive number")
    } else {
        print("Negative number")
    }
    
    JavaScript (他の多くのプログラミング言語)と違います.if の値を返します.

    ジャバスクリプト


    let result;
    if (number > 0) {
        result = "Positive number";
    } else {
        result = "Negative number";
    }
    

    小林


    val result = if (number > 0) {
        "Positive number"
    } else {
        "Negative number"
    }
    
    あなたが1行で書いているならば — したがって、三元演算子はありません.

    ジャバスクリプト


    const result = number > 0 ? "Positive number" : "Negative number";
    

    小林


    val result = if (number > 0) "Positive number" else "Negative number"
    

    スイッチする


    コリンにはwhen JavaScriptの代替として考えられる構文switch

    ジャバスクリプト


    switch (selectedFruit) {
      case "orange":
        console.log("Oranges are 59 cents a pound.");
        break;
      case "apple":
        console.log("Apples are 32 cents a pound.");
        break;
      case "cherry":
        console.log("Cherries are one dollar a pound.");
        break;
      case "mango":
      case "papaya":
        console.log("Mangoes and papayas are 3 dollars a pound.");
        break;
      default:
        console.log(`Sorry, we are out of ${selectedFruit}.`);
    }
    

    小林


    when(selectedFruit) {
        "orange" -> print("Oranges are 59 cents a pound.")
        "apple" -> print("Apples are 32 cents a pound.")
        "cherry" -> print("Cherries are one dollar a pound.")
        "mango", "papaya" -> print("Mangoes and papayas are 3 dollars a pound.")
        else -> print("Sorry, we are out of $selectedFruit.")
    }
    
    実際には、小林のwhen これよりずっと強力です、そして、多くの人々はそれを「超能力によるスイッチ」と言います.ここにいくつかwhen 長所
  • 式として使用することができます
  • 任意条件式
  • 自動的に値をキャストすることができます
  • 引数なしで使用することができます
  • これは、すべての可能な条件を一致させる必要があります
  • 私は、Kotlinのもので深く潜りませんwhen この記事では、コードで非常に有用であることを知っておくことが重要です.あなたが準備ができたと感じるとき、これを参照してくださいarticle もっと学ぶ.

    ループ


    コリンは、Aを提供しますfor ループですが、イテレータだけで動作します.幸いなことに、Kollinも範囲、イテレータを提供します.. 演算子:

    ジャバスクリプト


    for (let i = 1; i<=10; i++) {
        console.log(i);
    }
    // 1 2 3 4 5 6 7 8 9 10
    
    
    const places = ["New York", "Paris", "Rio"];
    for (const place of places) {
      console.log(`I Love ${place}`);
    }
    // I Love New York 
    // I Love Paris
    // I Love Rio
    

    小林


    for (i in 1..10) {
        print(i)
    }
    // 1 2 3 4 5 6 7 8 9 10
    
    
    val places = listOf("New York", "Paris", "Rio")
    for (place in places) {
        println("I Love $place")
    }
    // I Love New York 
    // I Love Paris
    // I Love Rio
    

    コレクション


    kotlinはコレクションリテラルを提供しません(オブジェクトの配列や{}など).代わりに、コレクションを作成するために使用できるグローバル関数を提供します.この決定の背後にある推論は、言語がコレクションリテラルを提供するとき、どのように使用がコレクションを使用するかに影響を与えます(そして、拡張子によって、人々が言語自体を使う方法).mutable vs immutable、list vs array - kotlinはユーザーに選択の自由を与えます.

    配列(この場合、動的に成長できるもののリストを意味する)


    「配列」は異なるプログラミング言語で異なることを意味する過負荷期間です — そして、それはKotlinとまったく同じです:それは配列を持ちます、しかし、彼らはJavaScript配列に匹敵しません(すなわち、彼らはダイナミックに成長するか、縮小することができるリストでありません).この場合、より多くのコレクションはリストです.

    ジャバスクリプト


    const houses = [ "Stark", "Lannister", "Tyrell", "Arryn", "Targaryen", "Baratheon" ];
    houses[2]; // "Tyrell"
    houses.push("Martell");
    houses.length; //7
    

    小林


    val houses = mutableListOf("Stark", "Lannister", "Tyrell", "Arryn", "Targaryen", "Martell", "Baratheon")
    houses[2] // "Tyrell"
    houses.add("Martell")
    houses.size //7
    

    オブジェクト(この場合、キー値マップを意味します)


    JavaScriptのオブジェクトは多くの目的を提供します:それはHashMapです、しかし、それはすべて(原始的なものを除いて)が降ろされる基本的な構成でもあります(オブジェクトのようなユーティリティメソッドを見つける場所でもありません).コレクションについて話しているので、HashMapユースケース(キー値のペアを格納)を説明します.

    ジャバスクリプト


    const colors = {
      "red":  0xff0000,
      "green":  0x00ff00,
      "blue":  0x0000ff,
      "cyan":  0x00ffff,
      "magenta":  0xff00ff,
      "yellow":  0xffff00
    };
    colors.hasOwnProperty("yellow"); // true
    colors.yellow; // 0xffff00
    

    小林


    val colors =  mutableMapOf(
      "red" to 0xff0000,
      "green" to 0x00ff00,
      "blue" to 0x0000ff,
      "cyan" to 0x00ffff,
      "magenta" to 0xff00ff,
      "yellow" to 0xffff00
    )
    colors.contains("yellow") // true
    colors.get("yellow") // 0xffff00
    

    不変性に関する迅速なメモ


    また、コレクションの読み取り専用バージョンを提供します

    小林


    // mapOf is the read-only version of mutableMapof
    val colors =  mapOf(
      "red" to 0xff0000,
      "green" to 0x00ff00,
      "blue" to 0x0000ff
    )
    val updatedColors = colors.plus("teal" to 0x008080) // doesn't change the original - it returns a new map
    
    
    // listOf is the read-only version of mutableListof
    val houses = listOf("Stark", "Lannister", "Tyrell", "Arryn", "Targaryen", "Martell", "Baratheon")
    
    // Methods that return a new list instead of modifying it are still available:
    var updatedHouses = houses.take(3).map {it.toUpperCase()} //["STARK", "LANNISTER", "TYRELL"]
    
    // Adding new items requires copying the whole original one and making sure the new copy is also immutable
    var updatedHouses = houses.toMutableList().apply{ add("Martell") }.toList()
    

    破壊課題


    宣言構文の破壊は非常に便利であり、いくつかの行のコードを保存することができます.コレクションを値に割り当てるとき、Kotlinはブレークして両側にマッチし、左側の変数に値を代入します.最も簡単なケースでは、パラレル割り当てに使用できます.

    ジャバスクリプト


    const coordinates = [5, 10, 15];
    const [x, y, z] = coordinates;
    

    小林


    val coordinates = arrayOf(5, 10, 15)
    val (x, y, z) = coordinates
    
    上記の例は愚かに見えますが、これは特に複数の値を返す関数を扱うのに便利です.

    ジャバスクリプト


    function weatherReport(location) {
      // Make an Ajax request to fetch the weather...
      return [72, "Mostly Sunny"];
    }
    const [temp, forecast] = weatherReport("Berkeley, CA");
    

    小林


    fun weatherReport(location) {
      // Make an Ajax request to fetch the weather...
      return Pair(72, "Mostly Sunny") // Pair is a standard class in Kotlin that represents a generic pair of two values
    }
    val (temp, forecast) = weatherReport("Berkeley, CA")
    

    クラス


    JavaScriptのように、Kotlinのクラスはキーワードを使って宣言されますclass :

    ジャバスクリプト


    class Monster {
      constructor(name, color, numEyes) {
        this.name = name;
        this.color = color;
        this.numEyes = numEyes;
      }
      speak(likes) {
          return `My name is ${this.name} and I like ${likes}`;
      }
    }
    var nhama = new Monster("Nhama", "red", 1);
    nhama.speak("guacamole")
    // "My name is Nhama and I like guacamole"
    

    小林


    class Monster(val name: String, val color: String, val numEyes: Int) {
      fun speak(likes: String):String {
          return "My name is $name and I like $likes"
      }
    }
    var nhama = Monster("Nhama", "red", 1)
    // Kotlin doesn't have a `new` keyword - you instantiate a class by calling it directly
    nhama.speak("guacamole")
    // "My name is Nhama and I like guacamole"
    
    Kotlinクラスにはコンストラクタもありますが、クラスプロパティを定義したい場合はキーワードを省略できます.

    データコンテナ


    JavaScriptでは、名前付きの値をグループ化してプレーンなオブジェクトを作成するのが一般的です.Kollinでは、データクラスを作成します — また、データコンテナとして動作しますが、ライターで、フィールド名を固定しており、より厳密にタイプされます.

    ジャバスクリプト


    const movie1 = {
        name: "Back to the Future",
        rating: 5,
        director: "Bob Zemeckis"
    }
    const movie2 = {
        name: "Star Wars: Episode IV - A New Hope",
        rating: 5,
        director: "George Lucas"
    }
    

    小林


    data class Movie(
      val name: String, 
      val rating: Int, 
      val director: String
    )
    val movie1 = Movie("Back to the Future", 5, "Bob Zemeckis")
    val movie2 = Movie("Star Wars: Episode IV - A New Hope", 5, "George Lucas")
    

    ここからどこへ行くか


    この記事を通して、Kotlinの構文は常にJavaScriptの構文に対比されていました.しかしながら、KotlinがJavaScriptと並列にならないユニークなアプローチを持っているいくつかの領域があります.最も顕著な例は、Kotlinの無効性へのアプローチです.この記事の上で、私はKotlinのユニークな特徴のいくつかをカバーします.