Scala インタビューの質問

前の投稿を読む前に、「Scala Basic Interview Questions and Answers」でScala言語の基本知識を得てください。この投稿では、経験豊富なScala開発者にとって役立ついくつかのScalaインタビューの質問について議論します。注意: このリストはすでに非常に大きくなっているため、残りの質問と回答を別の投稿で提供する予定です。該当の投稿はこちらを参照してください:「Scala Intermediate and Advanced Interview Questions and Answers

Scala Interview Questions

このセクションでは、すべてのScala中級インタビューの質問をリストアップし、次のセクションではそれらについて詳しく議論します。

  1. 主要なコンストラクターとは何ですか?Scalaにおける2次または補助コンストラクターとは何ですか?
  2. Scalaにおける補助コンストラクターの使用目的は何ですか?Scalaで補助コンストラクターを定義する際の規則を説明してください。
  3. ScalaにおけるArrayとArrayBufferの違いは何ですか?
  4. ケースクラスとは何ですか?ケースオブジェクトとは何ですか?ケースクラスの利点は何ですか?
  5. ケースオブジェクトとオブジェクト(通常のオブジェクト)の違いは何ですか?
  6. Normalクラスと比較すると、Caseクラスの主な利点やメリットは何ですか?
  7. ScalaでisInstanceOfメソッドとasInstanceOfメソッドの使用方法は?Javaに類似した概念はありますか?
  8. デフォルトでは、CaseオブジェクトはSerializableであり、通常のオブジェクトはそうではないことをどのように証明しますか?
  9. ScalaにおけるArrayとListの違いは何ですか?
  10. Scalaにおける「val」と「lazy val」の違いは何ですか?Eager Evaluationとは何ですか?Lazy Evaluationとは何ですか?
  11. Scalaにおけるequalsメソッドと==の関係は何ですか?Scalaの==とJavaの==演算子の違いは何ですか?
  12. ScalaのInnerクラスとJavaのInnerクラスの違いは何ですか?
  13. Diamond Problemとは何ですか?ScalaはどのようにDiamond Problemを解決しますか?
  14. なぜScalaには「static」キーワードがないのですか?この決定の主な理由は何ですか?
  15. Scalaにおける「object」キーワードの使用目的は何ですか?ScalaでSingletonオブジェクトを作成する方法は?
  16. Scalaでobjectキーワードを使用してFactoryメソッドを定義する方法は?objectでFactoryメソッドを定義する目的は何ですか?
  17. Scalaにおけるapplyメソッドとunapplyメソッドは何ですか?Scalaにおけるapplyとunapplyメソッドの違いは何ですか?
  18. Scalaで‘new’キーワードを使用せずにクラスのインスタンスを作成する場合の仕組みはどのように動作しますか?このアプローチはいつ使用しますか?
  19. Scalaでプライベートなプライマリコンストラクタを宣言する方法は?Scalaでプライベートなプライマリコンストラクタにどのように呼び出しを行いますか?
  20. Companionオブジェクトは、ScalaのCompanionクラスのプライベートメンバーにアクセスしますか?
  21. Scalaでの2つの異なるキーワード、classとobjectに関する主な設計上の決定は何ですか? Scalaでインスタンスメンバーと静的メンバーをどのように定義しますか?
  22. Scalaでのオブジェクトとは何ですか?それはシングルトンオブジェクトですか、それともクラスのインスタンスですか?
  23. Scalaでのコンパニオンオブジェクトとは何ですか? ScalaでのCompanion Classとは何ですか? ScalaでのCompanion Objectの使用目的は何ですか?
  24. Scalaでインターフェイスを実装する方法は?
  25. ScalaでのRangeとは何ですか? ScalaでRangeを作成する方法は?
  26. ScalaでのNothing型の値は何個ありますか?
  27. ScalaでのUnit型の値は何個ありますか?
  28. ScalaでのRangeとは何ですか? ScalaでRangeを作成する方法は?
  29. FPでは、関数と手続きの違いは何ですか?
  30. Scalaの補助コンストラクタとJavaのコンストラクタの主な違いは何ですか?
  31. Scalaのfor-comprehension構文での‘yield’キーワードの使用目的は何ですか?
  32. Scalaのfor-comprehension構文でのガードとは何ですか?
  33. Scalaは、Java 8よりも簡単に継承ダイヤモンド問題を自動的に解決する方法は?
  34. Scalaでは、パターンマッチングはどのデザインパターンに従いますか? Javaでは、‘isinstanceof’演算子はどのデザインパターンに従いますか?

Scala インタビューの質問と回答

このセクションでは、上記のリストから各質問をピックアップし、必要に応じて具体的な例とともに詳細に議論します。これらの概念を例とともに詳しく理解したい場合は、Scala チュートリアルセクションの前の投稿を参照してください。

プライマリコンストラクタとは?Scalaにおけるセカンダリまたは補助コンストラクタとは?Scalaにおける補助コンストラクタの目的は何ですか?Scalaではコンストラクタをオーバーロードすることは可能ですか?

Scalaには2種類のコンストラクタがあります:

  • プライマリコンストラクタ
  • 補助コンストラクタ

プライマリコンストラクタ Scalaでは、プライマリコンストラクタはクラス定義と同じくらいに定義されるコンストラクタです。各クラスはプライマリコンストラクタを必ず持たなければなりません。これは、パラメータコンストラクタまたはパラメータなしコンストラクタのいずれかです。例:-

class Person

上記のPersonクラスには、このクラスのインスタンスを作成するためのゼロパラメータまたはパラメータレスのプライマリコンストラクタが1つあります。

class Person (firstName: String, lastName: String)

上記のPersonクラスには、このクラスのインスタンスを作成するための2つのパラメータプライマリコンストラクタがあります。補助コンストラクタ補助コンストラクタは、セカンダリコンストラクタとしても知られています。以下に示すように、「def」と「this」キーワードを使用して補助コンストラクタを宣言できます:

class Person (firstName: String, middleName:String, lastName: String){
  def this(firstName: String, lastName: String){
      this(firstName, "", lastName)
  }
}

Scalaでの補助コンストラクタの使用目的は何ですか?Scalaで補助コンストラクタを定義する際のルールを説明してください。

Scalaでは、補助コンストラクタの主な目的は、コンストラクタをオーバーロードすることです。Javaと同様に、さまざまな種類のコンストラクタを提供して、使用者が必要に応じて適切なものを選択できるようにすることができます。補助コンストラクタのルール:

  • これらはメソッドと同様です。メソッドと同様に、これらを定義するために「def」キーワードを使用する必要があります。
  • すべての補助コンストラクタに同じ名前「this」を使用する必要があります。
  • 各補助コンストラクタは、前に定義された別の補助コンストラクタまたはプライマリコンストラクタへの呼び出しで始める必要があります。さもなければ、コンパイル時エラーが発生します。
  • 各補助コンストラクタは、そのパラメータリストで異なる必要があります:番号またはタイプによって異なる場合があります。
  • 補助コンストラクタはスーパークラスのコンストラクタを呼び出すことはできません。それらはプライマリコンストラクタ経由でのみそれらを呼び出す必要があります。
  • すべての補助コンストラクタは、プライマリコンストラクタを直接または間接的に他の補助コンストラクタを介して呼び出します。

注:Scalaのコンストラクタについて学びたい場合は、私のScalaの投稿を参照してください:プライマリコンストラクタおよび補助コンストラクタ

ScalaにおけるArrayとArrayBufferの違いは何ですか?

ScalaにおけるArrayとArrayBufferの違い:

  • Arrayは固定サイズの配列です。一度作成されると、サイズを変更することはできません。
  • ArrayBufferは可変サイズの配列です。サイズを動的に増減させることができます。
  • ArrayはJavaのプリミティブ配列に類似しています。
  • ArrayBufferはJavaのArrayListに類似しています。

ケースクラスとは何ですか? ケースオブジェクトとは何ですか? ケースクラスの利点は何ですか?

ケースクラスは、「case class」というキーワードで定義されるクラスです。ケースオブジェクトは、「case object」というキーワードで定義されるオブジェクトです。この「case」キーワードのため、ボイラープレートコードを避けるためのいくつかの利点が得られます。私たちは「new」キーワードを使用せずにケースクラスのオブジェクトを作成することができます。デフォルトでは、Scalaコンパイラーはすべてのコンストラクタパラメータに「val」をプレフィックスします。そのため、valまたはvarを使用せずにケースクラスのコンストラクタパラメータはクラスメンバーになります。これは通常のクラスでは不可能です。ケースクラスの利点:

  • デフォルトでは、ScalaコンパイラーはtoString、hashCode、equalsメソッドを追加します。このボイラープレートコードを書く必要がなくなります。
  • デフォルトでは、Scalaコンパイラーはapplyおよびunapplyメソッドを持つコンパニオンオブジェクトを追加します。そのため、ケースクラスのインスタンスを作成するためにnewキーワードが必要ありません。
  • デフォルトでは、Scalaコンパイラーはcopyメソッドも追加します。
  • パターンマッチングでケースクラスを使用することができます。
  • デフォルトでは、ケースクラスとケースオブジェクトはシリアライズ可能です。

Caseオブジェクトと通常のオブジェクト(Normal Object)の違いは何ですか?

  • 通常のオブジェクトは、「object」キーワードを使用して作成されます。デフォルトでは、シングルトンオブジェクトです。
object MyNormalObject
  • Caseオブジェクトは、「case object」キーワードを使用して作成されます。デフォルトでは、これもシングルトンオブジェクトです
case object MyCaseObject
  • デフォルトでは、CaseオブジェクトにはtoStringおよびhashCodeメソッドがあります。しかし、通常のオブジェクトにはありません。
  • デフォルトでは、CaseオブジェクトはSerializableです。しかし、通常のオブジェクトはそうではありません。

通常のクラスと比較して、Caseクラスの主な利点やメリットは何ですか?

次は、Caseクラスが通常のクラスに対して持つ主な利点やメリットです:

  • 便利なメソッドを自動的に追加することで、冗長なコードを回避します。
  • デフォルトで、パラメータが「val」であるため、イミュータビリティをサポートします。
  • パターンマッチングで簡単に使用できます。
  • Caseクラスのインスタンスを作成するために「new」キーワードを使用する必要はありません。
  • デフォルトでは、シリアル化とデシリアル化がサポートされています。

ScalaでのisInstanceOfメソッドとasInstanceOfメソッドの使用法は何ですか? Javaに類似した概念はありますか?

isInstanceOfメソッドとasInstanceOfメソッドはどちらもAnyクラスで定義されています。したがって、これらのメソッドを任意のクラスまたはオブジェクトに取得するためのインポートは必要ありません。 「isInstanceOf」メソッドは、オブジェクトが指定された型であるかどうかをテストするために使用されます。そうであれば、trueを返します。そうでなければfalseを返します。

   scala> val str = "Hello"
   
   scala>str.isInstanceOf[String]
   res0: Boolean = false   
 

「asInstanceOf」メソッドは、オブジェクトを指定された型にキャストするために使用されます。指定されたオブジェクトと型が同じ型である場合、指定された型にキャストされます。それ以外の場合、java.lang.ClassCastExceptionがスローされます。

 scala> val str = "Hello".asInstanceOf[String]
 str: String = Hello
 

Javaでは、「instanceof」キーワードがScalaの「isInstanceOf」メソッドに類似しています。 Javaでは、次のような手動の型キャストがScalaの「asInstanceOf」メソッドに類似しています。

AccountService service = (AccountService)
 context.getBean("accountService");

デフォルトでは、Case ObjectがSerializableであり、Normal ObjectがSerializableでないことをどのように証明しますか?

はい、デフォルトでは、ケースオブジェクトはシリアライズ可能です。ただし、通常のオブジェクトはそうではありません。これを以下に示すようにisInstanceOfメソッドを使用して証明できます:

scala> object MyNormalObject
defined object MyNormalObject

scala> MyNormalObject.isInstanceOf[Serializable]
res0: Boolean = false

scala> case object MyCaseObject
defined object MyCaseObject

scala> MyCaseObject.isInstanceOf[Serializable]
res1: Boolean = true

ScalaにおけるArrayとListの違いは何ですか?

  • Arraysは常にミュータブルで、Listは常にイミュータブルです。
  • 作成した後、Arrayの値を変更できますが、Listオブジェクトは変更できません。
  • Arraysは固定サイズのデータ構造で、Listは可変サイズのデータ構造です。 Listのサイズは、それに対して実行される操作に基づいて自動的に増減します。
  • Arraysは不変であり、Listは共変です。

注意:- 不変と共変について確信が持てない場合は、次のScala面接の質問に関する私の次の投稿を読んでください。

Scalaにおける「val」と「lazy val」の違いは何ですか?イーガー評価とは何ですか?レイジー評価とは何ですか?

基本的なScala面接の質問で議論したように、「val」は不変の変数を定義するために使用される値または定数を意味します。プログラムの評価には2種類あります:

  • Eager Evaluation
  • Lazy Evaluation

Eager Evaluationは、クライアントがそのプログラムを使用しているかどうかに関係なく、コンパイル時またはプログラムの展開時にプログラムを評価することを意味します。Lazy Evaluationは、クライアントがプログラムにアクセスしたときにのみ、実行時にプログラムをオンデマンドで評価することを意味します。 “val”と “lazy val”の違いは、 “val”が熱心に評価される変数を定義するために使用され、 “lazy val”も変数を定義するために使用されますが、それらは怠惰に評価されます。

Scalaにおけるequalsメソッドと==の関係は何ですか? Scalaの==とJavaの==オペレーターを区別するには?

Scalaでは、2つのインスタンスまたはオブジェクトを比較するためにequals()メソッドを呼び出す必要はありません。 Scalaでは、2つのインスタンスを==で比較すると、Scalaはそのオブジェクトのequals()メソッドを自動的に呼び出します。 Javaの==演算子は、2つの参照が同じオブジェクトを指しているかどうかをチェックするために使用されます。 Scalaの==は、2つのインスタンスが等しいかどうかをチェックするために使用されます。

Scalaの内部クラスとJavaの内部クラスの違いは何ですか?

Javaでは、内部クラスは外部クラスに関連付けられており、内部クラスは外部クラスのメンバーです。しかし、Javaと異なり、Scalaは外部クラスと内部クラスの関係を異なる方法で扱います。Scalaの内部クラスは外部クラスオブジェクトと関連付けられています。

ダイヤモンド問題とは何ですか?Scalaはダイヤモンド問題をどのように解決しますか?

A Diamond Problem is a Multiple Inheritance problem. Some people calls this problem as Deadly Diamond Problem. In Scala, it occurs when a Class extends more than one Traits which have same method definition as shown below. Unlike Java 8, Scala solves this diamond problem automatically by following some rules defined in Language. Those rules are called “Class Linearization”. Example:-

trait A{   
  def display(){ println("From A.display")  }
}
trait B extends A{ 
  override def display() { println("From B.display") }
}
trait C extends A{ 
  override def display() { println("From C.display") }
}
class D extends B with C{ }

object ScalaDiamonProblemTest extends App {
    val d = new D
    d display
}

ここでの出力は、トレイトCからの「From C.display」という形です。Scalaコンパイラは「extends B with C」という部分を右から左に読み、最も右のトレイトであるCから「display」メソッドの定義を取ります。注:これを明確に説明したい場合は、「Scala Traits in Depth」の投稿をご覧ください。

なぜScalaには「static」キーワードがないのですか?この決定の主な理由は何ですか?

わかっているように、Scalaには「static」キーワードがまったくありません。これはScalaチームによって行われた設計上の決定です。この決定を下した主な理由は、Scalaを純粋なオブジェクト指向言語にするためです。 「static」キーワードは、オブジェクトを作成せずにクラスメンバーにアクセスできることを意味します。これは完全にOOPの原則に反します。言語が「static」キーワードをサポートしている場合、その言語は純粋なオブジェクト指向言語ではありません。 たとえば、Javaが「static」キーワードをサポートしているため、それは純粋なオブジェクト指向言語ではありませんが、Scalaは純粋なオブジェクト指向言語です。

Scalaでの「object」キーワードの使用目的は何ですか? Scalaでシングルトンオブジェクトを作成する方法は?

Scalaでは、objectキーワードが次の目的で使用されます:

  • Scalaでシングルトンオブジェクトを作成するために使用されます。
object MySingletonObject

ここでは、MySingletonObjectは自動的にシングルトンオブジェクトになります。- objectキーワードは、実行可能なScalaプログラムであるScalaアプリケーションを定義するために使用されます。

object MyScalaExecutableProgram{   
   def main(args: Array[String]){
       println("Hello World")
   }
}

上記のようにmainメソッドをオブジェクトに定義すると(これはJavaのmain()メソッドと同じです)、それは自動的に実行可能なScalaプログラムとして機能します。- 「static」キーワードを使用せずに静的メンバー(静的変数や静的メソッド)を定義するために使用されます。

object MyScalaStaticMembers{ 
  val PI: Double = 3.1414  
  def add(a: Int, b: Int) = a + b
}

def PI変数とaddメソッドは、静的メンバーとして定義されます。これは、MyScalaStaticMembers.add(10,20)のような別のオブジェクトを作成せずに呼び出すことができることを意味します。これは、ファクトリーメソッドを定義するために使用されます。この次の質問をご覧ください。

Scalaでobjectキーワードを使用してファクトリーメソッドを定義する方法は?ファクトリーメソッドを定義することの利点は何ですか?

Scalaでは、「object」キーワードを使用してファクトリーメソッドを定義します。Scalaにおけるこれらのファクトリーメソッドの主な目的は、「new」キーワードを使用しないことです。 「new」キーワードを使用せずにオブジェクトを作成することができます。ファクトリーメソッドを定義するには:Scalaでは、applyメソッドを使用してファクトリーメソッドを定義することができます。プライマリコンストラクタと複数の補助コンストラクタがある場合、以下に示すように複数のapplyメソッドを定義する必要があります。

class Person(val firstName: String, val middleName: String, val lastName: String){
  def this(firstName: String, lastName: String){
    this(firstName,"",lastName)
  }
}
object Person{
  def apply(val firstName: String, val middleName: String, val lastName: String) 
        = new Person(firstName,middleName,lastName)

  def apply(val firstName: String, val lastName: String) 
        = new Person(firstName, lastName)
}

これで、newキーワードを使用せずに、またはnewキーワードを使用してPersonオブジェクトを作成することができます。

val p1 = new Person("Scala","Java")
or 
val p1 = Person("Scala","Java")

Scalaのapplyメソッドは何ですか?Scalaのunapplyメソッドは何ですか?Scalaのapplyメソッドとunapplyメソッドの違いは何ですか?

Scalaでは、applyメソッドとunapplyメソッドは非常に重要な役割を果たします。これらはPlay Frameworkでフォームデータとモデルデータのマッピングおよびアンマッピングにも非常に役立ちます。簡単に言えば、

  • applyメソッド:オブジェクトをそのコンポーネントから構築または組み立てるために使用されます。
  • unapplyメソッド:オブジェクトをそのコンポーネントに分解または分解するために使用されます。

Scalaのapplyメソッド:これは、そのコンポーネントを使用してオブジェクトを構築するために使用されます。例えば、Personオブジェクトを作成したい場合は、firstNameとlastNameの2つのコンポーネントを使用してPersonオブジェクトを構築します。

class Person(val firstName: String, val lastName: String)

object Person{
  def apply(firstName: String, lastName: String) 
        = new Person(firstName, lastName)
}

Scalaのunapplyメソッド:これは、オブジェクトをそのコンポーネントに分解するために使用されます。applyメソッドの逆のプロセスに従います。例えば、Personオブジェクトがある場合は、このオブジェクトをfirstNameとlastNameの2つのコンポーネントに分解できます。

class Person(val firstName: String, val lastName: String)

object Person{
  def apply(firstName: String, lastName: String) 
        = new Person(firstName, lastName)

    def unapply(p: Person): (String,String) 
        = (p.firstName, p.lastName)
}

Scalaで「new」キーワードを使用せずにクラスのインスタンスを作成すると、その仕組みはどのようになりますか?このアプローチを取るのはいつですか?Scalaでプライベートコンストラクタを宣言する方法はありますか?

Scalaでは、「new」キーワードを使用せずにクラスのインスタンスを作成すると、内部で対応するコンパニオンオブジェクトにある適切なapplyメソッドが呼び出されます。ここでの適切なapplyメソッドとは、パラメータと一致するものです。 このオプションを選択するのはいつですか: プライベートコンストラクタを提供し、’new’キーワードの使用を避ける必要がある場合、同じパラメータセットを持つapplyメソッドのみを実装し、クラスのユーザーが新しいキーワードを使用せずに作成できるようにします。

Scalaでプライベートなプライマリコンストラクタを宣言するにはどうすればよいですか?Scalaでプライベートなプライマリコンストラクタを呼び出すにはどうすればよいですか?

Scalaでは、プライベートなプライマリコンストラクタを非常に簡単に宣言できます。クラス名の直後とパラメータリストの前に「private」を追加するだけで、プライマリコンストラクタを定義します。

class Person private (name: String)
object Person{
 def apply(name: String) = new Person(name)
}

これはプライベートコンストラクタなので、外部からは呼び出すことができません。上記のようにファクトリーメソッド(applyメソッド)を提供し、間接的にそのコンストラクタを使用する必要があります。

Scalaのコンパニオンオブジェクトは、そのコンパニオンクラスのプライベートメンバーにアクセスできますか?

一般的に、プライベートメンバーはそのクラス内でのみアクセス可能です。しかし、Scalaのコンパニオンクラスとコンパニオンオブジェクトは別の機能を提供しています。Scalaでは、コンパニオンオブジェクトはそのコンパニオンクラスのプライベートメンバーにアクセスでき、コンパニオンクラスはそのコンパニオンオブジェクトのプライベートメンバーにアクセスできます。

Scalaにおける2つの異なるキーワード、classとobjectの主要な設計上の決定は何ですか?Scalaでインスタンスメンバーと静的メンバーをどのように定義しますか?

Scalaでは、インスタンスメンバーを定義するためにclassキーワードを使用し、静的メンバーを定義するためにobjectキーワードを使用します。Scalaにはstaticキーワードがないため、それでもobjectキーワードを使用して定義することができます。これに関する主な設計上の決定は、インスタンスメンバーと静的メンバーの明確な区別です。それらの間の緩やかな結合。そして、Scalaを純粋なOOP言語にするためにstaticキーワードを避けるという主な理由です。

Scalaにおけるobjectとは何ですか?それはシングルトンオブジェクトですか、それともクラスのインスタンスですか?

Javaとは異なり、Scalaには ‘object’ について2つの意味があります。これについて混乱しないでください、私がはっきり説明します。Javaでは、 ‘object’ についてはクラスのインスタンスという1つの意味しかありません。

  • Javaと同様、objectの最初の意味は「クラスのインスタンス」です。
val p1 = new Person("Scala","Java")
or 
val p1 = Person("Scala","Java")
  • セカンドの意味は、オブジェクトがScalaのキーワードであるということです。これは、Scalaの実行可能なプログラム、コンパニオンオブジェクト、シングルトンオブジェクトなどを定義するために使用されます。

Scalaにおけるコンパニオンオブジェクトとは何ですか?Scalaにおけるコンパニオンクラスとは何ですか?Scalaにおけるコンパニオンオブジェクトの使用目的は何ですか?

簡単に言えば、Scalaのクラスとオブジェクトが同じ名前で同じソースファイルに定義されている場合、そのクラスは「コンパニオンクラス」と呼ばれ、そのオブジェクトは「コンパニオンオブジェクト」と呼ばれます。「class」キーワードを使用してクラスを作成し、「object」キーワードを使用して同じ名前のオブジェクトを同じソースファイルに作成する場合、そのクラスは「コンパニオンクラス」と呼ばれ、そのオブジェクトは「コンパニオンオブジェクト」と呼ばれます。例: Employee.scala

class Employee{ }
object Employee{ }

Scalaでは、コンパニオンオブジェクトの主な目的は、applyメソッドを定義し、そのコンパニオンクラスのインスタンス作成時にnewキーワードを使用しないようにすることです。

Scalaでインタフェースを実装する方法はありますか?

私たちはJavaのバックグラウンドから知っているように、インターフェースはコンタクトを定義するために使用されます。しかし、Scalaにはインターフェースの概念はありません。実際、Scalaにはインターフェースのキーワードもありません。Scalaには、より強力で柔軟な概念であるトレイトがあります。

ScalaでのRangeとは何ですか?ScalaでRangeを作成する方法はありますか?

RangeはScalaでの遅延コレクションです。Rangeは「scala.Range」という「scala」パッケージで利用可能なクラスです。これは整数値のシーケンスを表すために使用されます。整数の順序付けられたシーケンスです。

Scalaでは、Nothing型の値は存在しません。値はゼロです。何の値も持っていません。これはすべてのValueクラスとReferenceクラスのサブタイプです。

scala> 1 to 10
res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> 1 until 10
res1: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)

Scalaでは、Unit型の値はいくつありますか?

Scalaでは、Unit型の値は1つだけあります。それはユニット値と呼ばれ、副作用を持たない関数の戻り値として使用されます。

Scalaでは、Nothing型の値はいくつありますか?

Scalaでは、UnitはJavaのvoidキーワードに類似したものです。これは「値が存在しない」を表すために使用されます。その唯一の値は()です。

純粋な関数とは何ですか?

A pure function is a function without any observable side-effects. That means it returns always same results irrespective how many times we call it with same inputs. A pure function always gives same output for the same inputs. For Example:-

scala> 10 + 20
res0: Int = 30
scala>
scala> 10 + 20
res0: Int = 30

ここでは、Intクラスで利用可能な純粋な関数である「+」があります。同じ入力10と30に対して、何回呼び出しても同じ結果30を返します。

関数と手続きの違いは何ですか?

両者は計算を行うために使用されますが、関数型プログラミングの世界では1つの主要な違いがあります。関数は副作用のない計算単位であり、手続きは副作用のある計算単位でもあります。

Scalaの補助コンストラクタとJavaのコンストラクタの主な違いは何ですか?

Scalaの補助コンストラクタは、Javaのコンストラクタとほぼ同じですが、いくつかの違いがあります。Javaのコンストラクタと比べて、補助コンストラクタには以下のような違いがあります:

  • 補助コンストラクタは、”this”キーワードを使用して呼び出されます。
  • すべての補助コンストラクタは、同じ名前で定義されます。Javaでは、クラス名を使用してコンストラクタを定義します。
  • 各補助コンストラクタは、以前に定義された補助コンストラクタまたは主コンストラクタの呼び出しで始める必要があります。
  • 補助コンストラクタを定義するためには、メソッド/関数定義とは異なる”def”キーワードを使用します。Javaでは、コンストラクタの定義とメソッドの定義は異なります。

Scalaのfor-comprehension構文での”yield”キーワードの使用目的は何ですか?

Scalaのfor-comprehension構文では、”yield”キーワードを使用することができます。”for/yield”は、要素のコレクションを反復し、同じ型の新しいコレクションを生成するために使用されます。元のコレクションは変更されません。例えば、Listを反復するために”for/yield”構文を使用すると、新しいListが生成されます。

scala> val list = List(1,2,3,4,5)
list: List[Int] = List(1, 2, 3, 4, 5)

scala> for(l <- list) yield l*2
res0: List[Int] = List(2, 4, 6, 8, 10)

Scalaのfor-comprehension構造におけるguardとは何ですか?

Scalaでは、for-comprehension構造にはいくつかの要素をフィルタリングし新しいコレクションを生成するための条件を記述するif句があります。このif句は「ガード」とも呼ばれます。そのガードがtrueであれば、その要素を新しいコレクションに追加します。そうでなければ、その要素を元のコレクションに追加しません。例: For-comprehensionのガードを使用して新しいコレクションに偶数だけを生成します。

scala> val list = List(1,2,3,4,5,6,7,8,9,10)
list: List[Int] = List(1, 2, 3, 4, 5 , 6 , 7 , 8 , 9 , 10)

scala> for(l <- list if l % 2 =0 ) yield l
res0: List[Int] = List(2, 4, 6, 8, 10)

ScalaはなぜJava 8よりも簡単かつ自動的に継承のダイアモンド問題を解決できるのですか?

Java 8のデフォルトメソッドを使用すると、継承のダイアモンド問題が発生します。Java 8では、この問題を手動で解決する必要がありますが、デフォルトまたは自動的な解決方法は提供されません。Scalaでは、Traitsを使用すると同じ問題が発生しますが、Scalaは非常に賢く、クラスの線形化コンセプトを使用して継承のダイアモンド問題を自動的に解決します。

Scalaでは、パターンマッチングはどのデザインパターンに従いますか? Javaでは、「isinstanceof」演算子はどのデザインパターンに従いますか?

Scalaでは、パターンマッチングはVisitorデザインパターンに従います。同様に、Javaの「isinstanceof」演算子もVisitorデザインパターンに従います。これがすべての「Scala中級インタビューの質問と回答」に関するものです。今後の投稿では、いくつかの高度なScalaインタビューの質問と回答をご紹介します。この投稿が気に入ったり、問題や提案がある場合は、コメントを残してください。

Source:
https://www.digitalocean.com/community/tutorials/scala-interview-questions