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

4

2 に答える 2

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

ご覧のとおり、タイプにアクセスするだけで、遅延値を実際に評価する必要はありません。

于 2013-02-13T14:59:33.207 に答える
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このような使用については、いわゆるパス依存型であり、このような場合は狭すぎて役に立たないため、より慎重に検討することをお勧めします。

scala> m1(lv1)
res6: Int = 3

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

randomNonSpaceCoordinateあなたの場合、あなたはでしか呼び出すことができないでしょう、nonSpacesそれを引数として渡すことは少し無意味になります。

于 2013-02-13T15:04:38.563 に答える