2016-09-22 2 views
0
object sandbox { 

    class Numbers { 
    def price() : List[Int] = List(1,3,5,7) 
    def printIt(): Unit = { 
     price.foreach(x => print(x+ " ")) 
    } 
    } 

    trait DoubleIt extends Numbers { 
    override def price() : List[Int] ={ 
     println("doubling") 
     super.price.map(x => x*2) 
    } 
    } 

    trait AddIt extends Numbers { 
    override def price() : List[Int] = { 
     println("adding") 
     super.price.map(x => x+2) 
    } 
    } 

    def main(args :Array[String]): Unit = { 
    val obj = new Numbers with DoubleIt with AddIt 
    obj.printIt() 
    } 

} 
//output : 
adding 
doubling 
4 8 12 16 

В приведенном выше коде, price() метод из AddIt признака выполняет первый (от оператора печати) .Но не должно быть значение 6 10 14 18? Почему перед добавлением значения удваиваются?Скала Тре Mixin заказ

ответ

4

Ваши черты уложены в том порядке, что вы объявляете их:

Addit

DoubleIt

Числа

При запуске printIt, вы делаете это на Addit, в результате чего в следующей цепочке вызовов:

AddIt.printIt 
AddIt.printIt.price  //here you get to print "adding" 
AddIt.price.super.price //calls DoubleIt's price 
DoubleIt.price   //here you get to print "doubling" 
DoubleIt.super.price  //calls Number's price 
Numbers.price    //returns List(1, 3, 5, 7) 
DoubleIt.super.price.map //doubles your list input 
AddIt.super.price.map  //adds 2 to the result 
AddIt.printIt.foreach  //prints the final result 
5

Результат имеет смысл:

  1. printIt звонки AddIt.price
  2. AddIt.price звонки DoubleIt.price и затем добавляет 2 к каждому один
  3. DoubleIt.price вызовов Numbers.price, а затем dubles каждый, возвращая List(2,6,10,14)
  4. Это означает, что AddIt.price возвращает List(2+2, 6+2, 10+2, 14+2), что это действительно результат печати

Ключевым моментом здесь является понимание того, что действительно AddIt.priceначинается до того DoubleIt.price, но он использует результат DoubleIt.price для создания возвращаемого значения, перед тем добавлением.

Смежные вопросы