2013-02-13 45 views
3

正如问题标题所述,访问type的成员是否会导致该成员的评估?或者它只是使用它的静态类型?访问lazy val的类型是否会导致它被评估?

这里是其中我有一个implicit lazy val的示例代码,我想在与该类型的接受implicit val的方法使用它的类型:

implicit lazy val nonSpaces: Array[(Point, Part)]

.. 。

def randomNonSpaceCoordinate(implicit nonSpaces: this.nonSpaces.type): Point = nonSpaces(Utils.Random.randUpTo(nonSpaces.length))._1

回答

5

让我们来看看:

scala> object Test { 
    | lazy val test: String = {println("bang!"); "value"} 
    | val p: this.test.type = null 
    | def testDef(p: this.test.type) = println(p) 
    | } 
defined module Test 

scala> Test.testDef(Test.p) 
null 

scala> Test.testDef(Test.test) 
bang! 
value 

因此,大家可以看到刚刚访问类型不需要懒惰VAL实际进行评估。

+0

我得到了我的答案,谢谢。我认为我很懒,因为我也可以尝试。但是将它作为StackOverflow中的QA很好,对不对? 所以只需访问该类型不需要实际评估惰性val。你能编辑你的答案来包含这个声明吗? 谢谢。 – ciuncan 2013-02-13 15:02:31

5

编号类型的计算(除了他们的影子自己“反射”)是编译时的事情。然而

scala> lazy val lv1 = { println("Initializing lv1"); "lv1" } 
lv1: String = <lazy> 

scala> def m1(s: lv1.type): Int = s.length 
m1: (s: lv1.type)Int 

scala> lv1 
Initializing lv1 
res5: String = lv1 

,你可能要更加仔细地考虑使用.type这样的,因为它是一个所谓的路径depedent型和类似情况:

您可以验证这样的事情这一点,可能是过于狭窄是有用的:

scala> m1(lv1) 
res6: Int = 3 

scala> m1("42") 
<console>:10: error: type mismatch; 
found : String("42") 
required: lv1.type 
       m1("42") 

在你的情况,你只能够调用randomNonSpaceCoordinatenonSpaces,使得它有点无谓至p完全可以把它作为一个论点。

+0

我不明白为什么第二次调用m1失败,是不是lv1.type alread字符串?它如何更具体?看起来'类型'不是我所理解的。你会建议什么?我想与我的隐式val作为参数具有相同的类型,因为我将使用本地val替代方法。例如,如果我使用与隐式val相同的类型表达式声明它们,那么可以吗? – ciuncan 2013-02-13 15:17:27

+2

这就是我的观点。它是'字符串',它是'nonSpaces'的类型_specifically_和没有其他'字符串'。因此术语“路径依赖型”。 – 2013-02-13 15:22:01

+0

啊,好的。所以这对我来说真的没什么用处。我将不得不考虑路径依赖型主题。目前我不知道哪个答案标记为“答案”,因为两者都是正确的,这是对我的问题的一个具体而有用的答案;另一方面,@senia的例子就是直接回答这个问题。 :) 有什么建议么? – ciuncan 2013-02-13 15:36:46

相关问题