いいアイデアです。
デフォルトの引数でシングルトンタイプを禁止すると衛生上の問題のようです。
$ scala
Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_111).
Type in expressions for evaluation. Or try :help.
scala> private val x = new Object ; def f(foo: x.type = x, i: Int) = i
<console>:11: error: private value x escapes its defining scope as part of type x.type
private val x = new Object ; def f(foo: x.type = x, i: Int) = i
^
scala> val x = new Object ; def f(foo: x.type = (x: x.type), i: Int) = i
x: Object = [email protected]
f: (foo: x.type, i: Int)Int
scala> f(i = 42)
<console>:13: error: type mismatch;
found : Object
required: x.type
f(i = 42)
^
あるいは全く、これはOKになります。
private[this] val x: Object = new java.lang.Object();
<stable> <accessor> def x: Object = $iw.this.x;
def f(foo: x.type = $iw.this.x, i: Int): Int = i;
<synthetic> def f$default$1: x.type = $iw.this.x
かの問題がデフォルト値に割り当てているのですか?
が、あなたはこれを行うことはできません。まだ明示的x
を提供することができます
scala> object x
defined object x
scala> def f(y: x.type = x, i: Int) = i
f: (y: x.type, i: Int)Int
scala> f(i = 42)
res2: Int = 42
:
scala> val x: x.type = new Object
<console>:36: error: recursive value x needs type
val x: x.type = new Object
^
私はあなたがx
がx.type
であることを知らせる必要がないため、この作品を推測しますこれは難読化することができます。
私はこれが失敗した原因を調査するにはあまりにも怖い:
scala> object x$$ ; def f(y: x$$.type = x$$, i: Int) = i
defined object x$$
f: (y: .type, i: Int)Int
scala> f(i = 42)
res0: Int = 42
scala> f(x$$, 42) // or x$$$
<console>:13: error: not found: value x$$
f(x$$, 42)
^
しかし、それは、オブジェクトが公開されていても、それへのアクセスが何らかの形で名前の符号化によって不自由されていることを示唆しています。
あなたは、おそらく何らかの形でマクロを書くことができます。 –