小编0__*_*0__的帖子

缺少非详尽匹配的警告

-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)

scala pattern-matching

6
推荐指数
1
解决办法
1073
查看次数

交换证据参数的类型参数的上限

我想放宽对特征类型参数的约束,而是将它们以证据参数的形式强加给方法.鉴于一些骨架设置:

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 implicit type-parameter

6
推荐指数
2
解决办法
295
查看次数

在sbt console/Scala REPL中抑制返回类型

我记得在某个地方有切换来抑制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)

scala sbt read-eval-print-loop

6
推荐指数
1
解决办法
675
查看次数

Enrich-My-Library适用于所有Traversables

我试图弄清楚如何编写一个适用于任何函数的函数交换函数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)

types scala implicit enrich-my-library

6
推荐指数
1
解决办法
205
查看次数

在工件名称中保留点

我有一个在工件名称中使用点的库,比如"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)

scala sbt

6
推荐指数
1
解决办法
191
查看次数

从模式匹配返回路径相关类型

鉴于异构类型:

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)

scala pattern-matching path-dependent-type

6
推荐指数
1
解决办法
238
查看次数

将F有界类型表示为抽象类型成员

我想将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

6
推荐指数
1
解决办法
469
查看次数

sbt:发布生成的源

我有一个项目,其中部分源生成(sourceGenerators in Compile).我注意到(在大多数情况下合理地)这些来源不会随着publishLocal或发布publishSigned.在这种情况下,这是不幸的,因为当您使用此项目/库作为依赖项时,即使已下载项目的其他源,也无法查找源代码,例如在IntelliJ中.

我可以配置sbt的发布设置以包含Maven中生成的源-sources.jar吗?

scala sbt

6
推荐指数
2
解决办法
938
查看次数

如何在 GnuPG 中编辑用户 ID 注释或设置新的默认用户 ID?

我想删除用户 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。

该怎么办?

gnupg

6
推荐指数
1
解决办法
3317
查看次数

@volatile usage unclear - 将带有`var`的对象发送到另一个线程

我不确定我@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)

 @volatile var size: Int
  ^
Run Code Online (Sandbox Code Playgroud)

第二个问题:我应该删除@volatile此处还是以不同方式更改它?

concurrency scala

6
推荐指数
1
解决办法
5053
查看次数