2013-11-28 26 views
0

Noob here。我如何創建一個可以代替以下兩種方法的單一方法?Scala:結合兩種方法,一種是返回List,另一種是將Set設置爲一種方法,使用泛型

def makeListSavingsAccounts(numSavAccts: Int): List[ SavingsAccount] = { 
    var saList: List[ BankAccount ] = List.empty 
    for (saIDX <- 1 to numSavAccts) saList :+= new SavingsAccount(5000) 
    saList 
    } 



    def makeSetSavingsAccounts(numSavAccts: Int): Set[ SavingsAccount] = { 
    var saSet: Set[ BankAccount ] = Set.empty 
    for (saIDX <- 1 to numSavAccts) saSet += new SavingsAccount(5000) 
    saSet 
    } 

喜歡的東西????

def makeCollectionSavingsAccounts[T <: ???[ SavingsAccount ]] (numSavAccts:Int): T = { 
    var saColl: T = ???.empty 

    for (saIDX <- 1 to numSavAccts) saColl ?????? new SavingsAccount(5000) 
    saColl 
    } 

我們感謝您分享您的廣大斯卡拉知識......

+1

爲了保持簡單:爲什麼不在第二個方法中調用列表中的toSet方法? –

+0

感謝您的建議。猜猜我也可以先打電話給toList。 我只是想了解如何使用泛型爲此。 – Lou

回答

3

這是Scala收集庫遵循的方式。所以我相信下面的方式是本地的。

scala> def makeSavingAccounts[T[_]](count:Int)(implicit cbf: scala.collection.generic.CanBuildFrom[T[_], BankAccount, T[BankAccount]]) = { 
     val builder = cbf() 
     builder.sizeHint(count) 
     for(i <- 1 to count) builder += SavingsAccount(5000) 
     builder.result 
     } 

scala> makeSavingAccounts[List](3) 
res0: List[BankAccount] = List(SavingsAccount(5000), SavingsAccount(5000), SavingsAccount(5000)) 

scala> makeSavingAccounts[Set](3) 
res2: Set[BankAccount] = Set(SavingsAccount(5000)) 
+3

您可以將CanBuildFrom的類型參數化更改爲'CanBuildFrom [Nothing,BankAccount,T [BankAccount]]'。即使在調用'makeSavingAccounts'方法時省略了類型參數,它也可以找到CanBuildFrom實例。 –

+0

我不得不使用'新的SavingsAccount(5000)' 相當的簽名!看起來我有很多要學習的東西。感謝所有人。克努特的建議也有效。猜猜我認爲它會更簡單:( – Lou

3

沒有任何神奇的東西,如CAN-集結來自和建設者:

def makeListSavingsAccounts(accsNum: Int): List[ SavingsAccount] = { 
    val accs = for (saIDX <- 1 to accsNum) yield new SavingsAccount(5000) 
    accs.toList 
} 

def makeSetSavingsAccounts(accsNum: Int): Set[SavingsAccount] = 
    makeListSavingsAccounts(accsNum).toSet 

附: makeListSavingsAccounts的替代實現方式是List.fill(accsNum)(new SavingsAccount(5000))

+1

正是我想到的:D –

+0

感謝這個例子,展示了Scala的簡潔性! – Lou