在 Scala 中将无限参数从一个函数传递到另一个函数
Pass infinite arguments from function to function in Scala
我是 Scala 的新手,最近我遇到了这个问题,我需要用 X 个参数调用函数 A,然后它会用相同的 X 个参数调用函数 B,但问题是我总是得到 "WrappedArray" 等等。
在 Lua 我会简单地这样做:
function processInfArgs(output,...)
for i,v in ipairs({...}) do
output[i]=tostring(v) --just example, stringify it
end
end
function takeInfArgs(...)
local out = {}
processInfArgs(out,...)
return out
end
local result = takeInfArgs(1,2,3.14,"four","five")
for i,v in pairs(result) do
print(v,type(v))
end
我会得到这个:
1 string
2 string
3.14 string
four string
five string
所以我尝试在 Scala 中做这样的事情:
import scala.collection.mutable
object AppMain extends App {
def processInfParams(output: mutable.ArrayBuffer[Any],params: Any*): Unit ={
for( param <- params ){
output += param.toString
}
}
def takeInfParams(params: Any*): mutable.ArrayBuffer[Any] ={
val output= mutable.ArrayBuffer[Any]()
processInfParams(output, params) //this somehow converts it to WrappedArray(...)!
output
}
val out = takeInfParams("Param 1","Param 2","Param 3",4,5,6)
for( thing <- out ){
println(thing+"\t"+thing.getClass.getName)
}
}
我明白了:
WrappedArray(Param 1, Param 2, Param 3, 4, 5, 6) java.lang.String
有了这个:
processInfParams(output, params) //this somehow converts it to WrappedArray(...)!
你可以让params展开如下:
processInfParams(output, params:_*)
通过使用 params
之后的 :_*
。
我是 Scala 的新手,最近我遇到了这个问题,我需要用 X 个参数调用函数 A,然后它会用相同的 X 个参数调用函数 B,但问题是我总是得到 "WrappedArray" 等等。
在 Lua 我会简单地这样做:
function processInfArgs(output,...)
for i,v in ipairs({...}) do
output[i]=tostring(v) --just example, stringify it
end
end
function takeInfArgs(...)
local out = {}
processInfArgs(out,...)
return out
end
local result = takeInfArgs(1,2,3.14,"four","five")
for i,v in pairs(result) do
print(v,type(v))
end
我会得到这个:
1 string
2 string
3.14 string
four string
five string
所以我尝试在 Scala 中做这样的事情:
import scala.collection.mutable
object AppMain extends App {
def processInfParams(output: mutable.ArrayBuffer[Any],params: Any*): Unit ={
for( param <- params ){
output += param.toString
}
}
def takeInfParams(params: Any*): mutable.ArrayBuffer[Any] ={
val output= mutable.ArrayBuffer[Any]()
processInfParams(output, params) //this somehow converts it to WrappedArray(...)!
output
}
val out = takeInfParams("Param 1","Param 2","Param 3",4,5,6)
for( thing <- out ){
println(thing+"\t"+thing.getClass.getName)
}
}
我明白了:
WrappedArray(Param 1, Param 2, Param 3, 4, 5, 6) java.lang.String
有了这个:
processInfParams(output, params) //this somehow converts it to WrappedArray(...)!
你可以让params展开如下:
processInfParams(output, params:_*)
通过使用 params
之后的 :_*
。