我想为变量设置一个默认值。但是我的 Scala 编译器说:
Error:(20, 16) unbound placeholder parameter
val p: T = _
^
Run Code Online (Sandbox Code Playgroud)
这是代码。
object InverseFunctionsExample extends App {
type D = Double
def f(x: D): D = 5 * x + 10
def g(x: D): D = 0.2 * x - 2
printMessage(isInversible(f, g))
def printMessage(inv: Boolean): Unit = {
if (inv) print("YES!") else print("NOPE!")
}
def isInversible[T](f: (T) => T, g: (T) => T): Boolean = {
val p: T = _
if (f(p) == g(p))
true
else
false
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以以val p某种方式使用默认值初始化 a ?
您可以使用反射来实例化类的新实例,但这对您来说可能不是很有用:
class Foo
classOf[Foo].getConstructor().newInstance()
Run Code Online (Sandbox Code Playgroud)
您可以在此处阅读反射 API,了解如何选择合适的构造函数。
您还可以有一个参数来指定如何实例化新实例:
def isInversible[T](f: T => T, g: T => T, def: => T) = f(def) == g(def)
Run Code Online (Sandbox Code Playgroud)
由于这看起来像是一个本质上面向数学的问题,因此您可能会对类型感兴趣Numeric,这可以帮助促进针对不同数字类型的这种逻辑。例如:
def intersectAtOrigin[T](f: T => T, g: T => T)(implicit n: Numeric[T]) = {
val zero = n.zero
f(zero) == g(zero)
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做:
def f(x: D): D = 5 * x + 10
def g(x: D): D = 0.2 * x - 2
intersectAtOrigin(f, g) //false, working with Doubles
intersectAtOrigin[Int](_ + 1, x => x * x + x + 1) //true, working with Ints
Run Code Online (Sandbox Code Playgroud)
您可以在此处的Numeric文档中阅读更多相关信息。