我相信,你想达到什么样的,是得到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'中有共同的代码。 –