-unchecked启用时,为什么以下内容不会产生警告:
object Order {
sealed trait EntryOption
case object EmptyEntry extends EntryOption
trait Entry extends EntryOption
def isEmpty(a: EntryOption): Boolean = a match {
case EmptyEntry => true
// case _: Entry => false
}
}
Run Code Online (Sandbox Code Playgroud)
在Scala 2.8.0 之前,我似乎遇到了完全相同的问题,没有足够的答案.
编辑
@Jed对我来说,仅对非抽象类发出警告是没有意义的Entry.考虑以下情况:
trait Order {
sealed trait EntryOption
case object EmptyEntry extends EntryOption
abstract sealed class Entry extends EntryOption
def isEmpty(a: EntryOption): Boolean = a match {
case EmptyEntry => true
// case _: Entry …Run Code Online (Sandbox Code Playgroud) 我想放宽对特征类型参数的约束,而是将它们以证据参数的形式强加给方法.鉴于一些骨架设置:
trait State[Repr]
object Observer {
def apply[Repr <: State[Repr]](reader: Reader[Repr]): Observer[Repr] =
new Observer[Repr] {}
}
trait Observer[A]
trait Reader [A]
Run Code Online (Sandbox Code Playgroud)
这有效:
trait StateX[Repr <: StateX[Repr]] extends State[Repr] {
protected def reader: Reader[Repr]
def observe: Observer[Repr] = Observer(reader)
}
Run Code Online (Sandbox Code Playgroud)
而这不是:
trait StateY[Repr] extends State[Repr] {
protected def reader: Reader[Repr]
def observe(implicit ev: Repr <:< State[Repr]): Observer[Repr] = Observer(reader)
}
Run Code Online (Sandbox Code Playgroud)
随着消息"inferred type arguments [Repr] do not conform to method apply's type parameter bounds [Repr <: State[Repr]]".由于证据ev表明这种构象,我想知道如何 …
我记得在某个地方有切换来抑制Scala REPL中返回类型的打印,但我找不到它.我特别感兴趣的是将此开关添加到sbt构建文件中.有点像returnTypes in console := false.
我现在有
scala> within( Span( 0, 33 ))
res7: scala.collection.immutable.IndexedSeq[(de.sciss.lucre.expr.SpanLike, scala.collection.immutable.IndexedSeq[(de.sciss.lucre.expr.Expr[de.sciss.lucre.stm.InMemory,de.sciss.lucre.expr.SpanLike], de.sciss.lucre.expr.Expr[de.sciss.lucre.stm.InMemory,Long])])] = Vector()
Run Code Online (Sandbox Code Playgroud)
而且出于明显的原因,我想要
scala> within( Span( 0, 33 ))
res7: Vector()
Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何编写一个适用于任何函数的函数交换函数Traversable[_],给定一个集合和交换索引.我想出了以下内容:
def swap[A, CC <% Traversable[A]](xs: CC, i: Int, j: Int): Traversable[A] = {
xs.slice(0, i) ++
xs.slice(j, j+1) ++
xs.slice(i+1, j) ++
xs.slice(i, i+1) ++
xs.slice(j+1, xs.size)
}
swap(List(1,2,3,4,5), 0, 4) // => List(5,2,3,4,1)
Run Code Online (Sandbox Code Playgroud)
我想知道如何将它变成Traversable的隐式扩展,让我可以调用它List(1,2,3,4,5).swap(0, 4).我能得到的最接近的是:
import language.implicitConversions
class RichTraversable[A, B <% Traversable[A]](xs: B) {
def swap(i: Int, j: Int): Traversable[A] = {
xs.slice(0, i) ++
xs.slice(j, j+1) ++
xs.slice(i+1, j) ++
xs.slice(i, i+1) ++
xs.slice(j+1, xs.size)
}
}
implicit def richTraversable[A, B <% Traversable[A]](ys: …Run Code Online (Sandbox Code Playgroud) 我有一个在工件名称中使用点的库,比如"org.scala-refactoring.library".使用项目名称定义,例如:
name := "org.scala-refactoring.library"
Run Code Online (Sandbox Code Playgroud)
这在使用时会转换为连字符publish-local,因此它变为"org-scala-refactoring-library".
如何保留已发布工件中的点?
这似乎是在出版而不是包装中发生的事情.例如,以下内容无效:
artifactName := { (sv, module, artifact) =>
s"${name.value}_${sv.binary}-${module.revision}.${artifact.extension}"
}
Run Code Online (Sandbox Code Playgroud)
它确实封装
target/scala-2.11.0-RC1/org.scala-refactoring.library_2.11.0-RC1-0.6.2-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)
但它仍然发布到
~/.ivy2/local/org.scala-refactoring/org-scala-refactoring-library_2.11.0-RC1/0.6.2-SNAPSHOT
Run Code Online (Sandbox Code Playgroud) 鉴于异构类型:
trait Request {
type Result
}
trait IntRequest extends Request {
type Result = Int
}
Run Code Online (Sandbox Code Playgroud)
如何让Scala编译器满意地根据模式匹配返回路径依赖类型:
def test(in: Request): in.Result = in match {
case i: IntRequest => 1234
case _ => sys.error(s"Unsupported request $in")
}
Run Code Online (Sandbox Code Playgroud)
错误:
<console>:53: error: type mismatch;
found : Int(1234)
required: in.Result
case i: IntRequest => 1234
^
Run Code Online (Sandbox Code Playgroud) 我想将F有界多态转换为抽象类型成员.
trait FBoundedMovable[Self <: FBoundedMovable[Self]] {
def moveTo(pos: Vect2): Self
}
Run Code Online (Sandbox Code Playgroud)
至
trait Movable { self =>
type Self <: (Movable { type Self = self.Self })
def moveTo(pos: Vect2): Self
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.
让我们定义一个实例:
case class Ship(pos: Vect2) extends Movable {
type Self = Ship
def moveTo(pos: Vect2) = copy(pos = pos)
}
Run Code Online (Sandbox Code Playgroud)
并尝试使用它:
// [error] found : a.Self
// [error] required: A
def move[A <: Movable](a: A, to: Vect2): A = a.moveTo(to)
Run Code Online (Sandbox Code Playgroud)
F有界版本工作正常.
def moveF[A <: FBoundedMovable[A]](a: A, to: …
scala abstract-type parametric-polymorphism f-bounded-polymorphism
我有一个项目,其中部分源生成(sourceGenerators in Compile).我注意到(在大多数情况下合理地)这些来源不会随着publishLocal或发布publishSigned.在这种情况下,这是不幸的,因为当您使用此项目/库作为依赖项时,即使已下载项目的其他源,也无法查找源代码,例如在IntelliJ中.
我可以配置sbt的发布设置以包含Maven中生成的源-sources.jar吗?
我想删除用户 ID 或更新其评论,或者至少将另一个用户 ID 设为默认值。这是因为它包含的注释有一个愚蠢的排版错误。喜欢:
gpg> list
pub 4096R/xxxxxxxx created: yyyy-mm-dd expires: yyyy-mm-dd usage: SCEA
trust: ultimate validity: ultimate
sub 4096R/xxxxxxxx created: yyyy-mm-dd expires: yyyy-mm-dd usage: SEA
[ultimate] (1). My Name (comment with a stupid typo) <my-primary@email-address>
[ultimate] (2) My Name <my-primary@email-address>
[ultimate] (3) My Name <my-second@email-address>
Run Code Online (Sandbox Code Playgroud)
如何删除(1)或制作(2)主要和默认用户 ID。导入我的密钥的每个人都会看到(1). 我尝试使用--edit-keywith primary 2,但我得到的只是
请仅选择一个用户 ID。
该怎么办?
我不确定我@volatile在这里使用得当.我有一个缓冲区,像这样:
final class BufD(val buf: Array[Double], @volatile var size: Int)
Run Code Online (Sandbox Code Playgroud)
哪个在进程之间发送,从而可能跨越线程边界.发件人可以size在发送之前更新字段.因此,我想确保接收器在任何情况下都不能size在这里看到陈旧的值.第一个问题:是否@volatile确保这或者是多余的?
现在我介绍一个特点:
trait BufLike {
@volatile var size: Int
}
final class BufD(val buf: Array[Double], @volatile var size: Int) extends BufLike
Run Code Online (Sandbox Code Playgroud)
这给了我一个编译器警告:
警告:(6,4)没有方法大小的注释的有效目标 - 它被丢弃未使用.您可以使用元注释指定目标,例如@(volatile @getter)
Run Code Online (Sandbox Code Playgroud)@volatile var size: Int ^
第二个问题:我应该删除@volatile此处还是以不同方式更改它?