我用单例对象创建了一个简单的应用程序,其中包含本地特征:
object Singleton {
trait FirstTrait {
val func1 = (i: Int) => i * 2
}
trait SecondTrait {
val func2 = (s: String) => s
}
trait ThirdTrait {
val func3 = () => println("Func 3")
}
}
现在,在Main
对象中,我想做这样的事情:
object Main extends App {
val singleton = Singleton.FirstTrait//cannot do this
}
但是我不能这样做(编译错误)。为什么?为什么我无法使用这种本地特征?如果我将Singleton
对象更改为:
object Singleton {
trait FirstTrait {
val func1 = (i: Int) => i * 2
}
trait SecondTrait {
val func2 = (s: String) => s
}
trait ThirdTrait {
val func3 = () => println("Func 3")
}
object FirstObject extends FirstTrait {
println(func1)
}
}
Main
运行良好,可以进行程序编译。但是我从Singleton
调用了另一个单例对象,而不是特征。我知道trait
不能被实例化,但是我认为这不是解决方案,因为我还有一个简单的ScalaTest
测试名称,看起来像
"Singleton" should "test it" in Singleton.FirstTrait{...}
,在这里我可以访问FirstTrait
。那为什么不能在普通代码中使用它呢?
我不太了解。也许我是个白痴,但如果有人能很好地向我解释,我将非常感激。
答案 0 :(得分:5)
它是trait
,因此您需要正确地“实例化”它:
val singleton = new Singleton.FirstTrait {}
// singleton: Singleton.FirstTrait = $anon$1@5e97da56
请注意,从技术上讲trait
不能实例化。上面的表达式是扩展特性的匿名类的实例。
答案 1 :(得分:1)
from sympy import *
ctx = {
"f": Function("f"),
"x": var("x",integer=True)
}
initial_conditions = {
0: 1,
1: 1,
2: 1,
3: 1
}
f = sympify("-2*f(x-1)+11*f(x-2)+12*f(x-3)-36*f(x-4) +41**(x-4)+3 -f(x)", ctx)
# calculate f(10) here without creating a closed from
# The code below will not work rsolve returns None
solve_for = sympify("f(x)", ctx)
solved = rsolve(f, solve_for, initial_conditions)
是类型,而不是值。你不能写
Singleton.FirstTrait
写不完
val singleton = Singleton.FirstTrait
等特性和类可以具有伴随对象(同名的val singleton = Int
val singleton = String
),但是object
显然没有同伴对象。
您可以将其用作一种类型,例如
FirstTrait