2017-05-17 11 views
0

次の出力を説明することができます。私はこのような単純なScalaのコード..スカラのコンパニオンオブジェクト

object compOrNotTest { 
    def main(args: Array[String]) { 
    var emp = new Employee("tom", 20) 
    println(emp) 
    println(Employee.adult(emp)) 
    Employee.printName("Roland", 38) 

    var emp2 = new Employee("Harry", 37) 
    Employee.printName(emp2) 
    } 
} 

class Employee(name: String, age: Int) { 
    val ageOfEmplyedd: Int = age 
    val nameEmp: String = name 

    override def toString() = this.name + " age : " + this.age 

    def printName() { 
    println("name is in Class " + nameEmp) 
    } 
} 

object Employee { 
    def adult(emp: Employee) = { 
    if (emp.ageOfEmplyedd > 18) 
     true 
    else 
     false 
    } 

    def printName(name: String, age: Int) = { 
    val emp1 = new Employee(name, age) 
    println("Name is : " + emp1.printName()) 
    } 

    def printName(emp1: Employee) = { 
    //val emp1 = new Employee(name, age) 
    println("Name is : "+ emp1.printName()) 
    } 
} 

を持っていると私は取得しています出力は、私の質問は、私は私だけName is :()を取得していますコンパニオンオブジェクトから呼び出すいたときに、なぜということです

tom age : 20 
true 
name is in Class Roland 
Name is :() 
name is in Class Harry 
Name is :() 

です。私はName is : name is in Class Rolandのようなものを期待しています。この場合、scalaの仕組みを理解するために私を助けてください。ありがとうございました

+0

あなたはそれがこの出力であるべきだと思いますか? ちょうど紙の中に入れてください。 'println("名前: "+ emp1.printName())'、 ここで、最初に 'emp1を実行すると、' Employee.printName( "Roland"、38) 'それはprint nameを呼び出します。 .printName() 'は" nameがClass Rolandにあります " を出力し、残りは" Name is :() "を出力します。 – Rumid

+0

オクラホマ、はい、私の悪い....ありがとう、いくつかのどのように混乱して.... – Biswajit

+0

@Biswajit私は助けることができるうれしいです。この質問はおそらくstackoveflowコミュニティには役に立たないでしょう(他の誰かが同じ問題を抱えてこの質問に達する可能性はありますか?)あなたはそれを削除することを検討することができます。 – Rumid

答えて

2

Employee.printName(クラスEmployee)の戻り値のタイプはUnitです。この関数はプロシージャ構文使用して宣言されなかった(その中に無い=符号の関数宣言、which has been deprecatedをもはやScalaのの将来のバージョンでサポートされる)Unitの関連した戻り値の型を持っているためです。戻り値のUnitは、Scalaで()と表されます。

次関数の宣言は等価です:

// Using (soon-to-be-deprecated) procedure syntax. 
def printName() { 
    println("name is in Class " + nameEmp) 
} 

// Using an explicit return type. 
def printName(): Unit = { 
    println("name is in Class " + nameExp) 
} 

// Using an inferred return type (note "=" in declaration). The last statement is the call 
// to println, which returns Unit, so a return type of Unit is inferred. 
def printName() = { 
    println("name is in Class " + nameExp) 
} 

あなたが印刷された文字列を返すように望んでいた場合、あなたはこのような何か必要があります:

def printName() = { 
    val s = "name is in Class " + nameEmp 
    println(s) 
    s 
} 

または、明示的なリターンを使用して最後のステートメントから推測するのではなく、次のように入力します。

def printName(): String = { 
    val s = "name is in Class " + nameEmp 
    println(s) 
    s 
} 
関連する問題