我相信,你想達到什麼樣的,是得到String
元素的索引(如果從1開始計數)的可變參數,或返回"No one"
。無需將索引傳遞給方法。你可以這樣說:
def hello(name: String, params: String*): Any = {
val idx = params.indexOf(name)
if (idx != -1) idx + 1 else "No One"
}
不幸的是這兩個this:
def Hello(name: String, args: Any*) = {
val index = args.indexOf(name)
if(index == -1)
args(args.length - 1)
else
args(index + 1)
}
和this:
def hello(name: String, param: Any*): Any= {
var index = 0
while(index < param.length) {
var n = name
var ar = param(index)
if (n.equals(ar)) return param(index + 1)
else index = index + 1
}
param(index -1)
}
被打破,因爲他們拋出一個異常,如果你試圖找到索引"No one"
,因爲index + 1
將等於數組的大小。最好將Scala中的東西與邏輯相等的==
進行比較。
但最好不要返回Any
所有,但返回Option[Int]
:
def hello(name: String, params: String*): Option[Int] =
Option(params.indexOf(name)).filter(_ != -1).map(_ + 1)
,那麼你可以使用它像這樣:
val message1 = hello("Jack", "rakesh" ,"Jack").getOrElse("No one")
val message2 = hello("ABC", "rakesh", "Jack", "Vik", "ram").getOrElse("No one")
接聽評論:
我想kn如何將混合數據類型傳遞給「參數」。
最簡單的辦法是讓他們所有類型Any
的,也得到字符串或整數返回類型
用同樣的方法,定義返回類型爲Any
這裏唯一的一個小問題是沒有編譯時檢查其他類型。例如。有人可能會將Boolean
或任何複雜對象與String
和Int
一起傳遞給您的函數。但是你可以在運行時檢查它,或者使用類型來限制它們。我不知道你的要求,也許這對你有好處。
如果有Any
是好的,那麼我會解決這個問題是這樣的:
def Hello(name: Any, params: Any*): Any = Option(params)
.withFilter(_.nonEmpty)
.map(_.indexOf(name))
.filter(i => i != -1 && i < params.length - 1)
.map(i => params(i + 1))
.getOrElse("No one")
或者,如果你可以假設,params
是從來沒有空,你必須使用上次PARAM作爲默認值,而不是隻是硬編碼"No one"
:
def Hello(name: Any, params: Any*): Any = Option(params)
.withFilter(_.nonEmpty)
.map(_.indexOf(name))
.filter(i => i != -1 && i < params.length - 1)
.map(i => params(i + 1))
.getOrElse(params.last)
通知對"No one"
攻擊檢查:i < params.length - 1
。 請注意,name
現在也是Any
類型。
現在,即使你通過"No one"
爲name
,則Option
將評估爲None
表達感謝的過濾器,並getOrElse
會給你默認"No one"
,而不是例外。
可能會使用'Any'可能會有幫助,但不是確切嗎? 'def func1(a:String,s:任何*):任何' –
你有沒有考慮過? 'def Hello(name:String,Param:E [Array [Int]/Array [String]]):[Int/String]'?你可以將它重載爲可變參數,並且在'Either'中有共同的代碼。 –