小编dhg*_*dhg的帖子

在Scala中由Int的运算符定义混淆

scala教程说,Int添加操作实际上是一种方法调用:1+1意思是1.+(1)

但是当我查看源代码时Int.scala,看起来该方法只会打印一条错误消息.任何人都可以向我解释这是如何工作的?

 def +(x: Int): Int = sys.error("stub")
Run Code Online (Sandbox Code Playgroud)

scala

20
推荐指数
3
解决办法
528
查看次数

`sbt run`来自项目目录之外

当我想运行我的Scala项目时,我cd到项目目录并做

$ sbt "run arg1"
Run Code Online (Sandbox Code Playgroud)

如何从项目目录外执行相同的操作?

scala sbt

20
推荐指数
1
解决办法
4132
查看次数

Scala - 从泛型类型中获取类对象

是否可以纯粹从泛型参数创建一个Class对象?例如:

class myclass[T] { 
  def something(): Class[_ <: T] = 
    classOf[T] //this doesn't work
}
Run Code Online (Sandbox Code Playgroud)

由于该类型将在运行时被删除,因此这似乎是清单的工作,但我还没有找到一个演示此特定用法的示例.我尝试了以下方法,但它也不起作用:

class myclass[T] { 
  def something()(implicit m: Manifest[T]): Class[_ <: T] = 
    m.erasure //this doesn't work
}
Run Code Online (Sandbox Code Playgroud)

我怀疑这个失败是由于,正如API指出的那样,m.erasure结果的类型和结果之间没有子类型关系T.

编辑:我不是真的对类型T是什么感兴趣,我只需要一个类型的对象Class[_ <: T]传递给hadoop框架中的方法.

有什么指针吗?

generics scala manifest

19
推荐指数
3
解决办法
2万
查看次数

一个干净的方法将两个元组组合成一个新的scala中更大的元组?

假设我有以下元组:

scala> val t1 = Tuple2("abcd", "efg")
t1: (java.lang.String, java.lang.String) = (abcd,efg)

scala> val t2 = Tuple2(1234, "lmnop")
t2: (Int, java.lang.String) = (1234,lmnop)

scala> val t3 = Tuple3("qrs", "tuv", "wxyz")
t3: (java.lang.String, java.lang.String, java.lang.String) = (qrs,tuv,wxyz)
Run Code Online (Sandbox Code Playgroud)

是否有一种友好的方式将它们(必要时分两步)组合成一个Tuple7?我真的在寻找一个结合任意大小的元组的一般答案,并意识到由于最大元组大小的上限会有限制.我特意寻找一个元组结果,而不是一个集合.

scala scalaz

15
推荐指数
2
解决办法
1万
查看次数

Scala:检查对象是否为Numeric

模式匹配是否可以检测某些东西是否是Numeric?我想做以下事情:

class DoubleWrapper(value: Double) {
  override def equals(o: Any): Boolean = o match {
    case o: Numeric => value == o.toDouble
    case _ => false
  }
  override def hashCode(): Int = value ##
}
Run Code Online (Sandbox Code Playgroud)

但是,当然,这并不真的是因为工作Numeric不是东西,像超IntDouble,这是一个类型类.我也做不了什么,def equals[N: Numeric](o: N)因为o必须Any要符合合同equals.

那么我怎么做而不列出每个已知的Numeric类(包括,我想,用户定义的类我可能都不知道)?

scala numeric typeclass

14
推荐指数
1
解决办法
1989
查看次数

Scala - 可以取消应用返回varargs?

L1下面的对象有效.我可以L1通过传入varargs 来"创建" ,这很好,但我希望能够L1使用相同的语法分配给一个.不幸的是,我在这里完成它的方式需要更粗略的嵌套Array内部语法L1.

object L1 {
    def apply(stuff: String*) = stuff.mkString(",")
    def unapply(s: String) = Some(s.split(","))
}
val x1 = L1("1", "2", "3")
val L1(Array(a, b, c)) = x1
println("a=%s, b=%s, c=%s".format(a,b,c))
Run Code Online (Sandbox Code Playgroud)

我尝试以一种显而易见的方式实现这一目标,L2如下所示:

object L2 {
    def apply(stuff: String*) = stuff.mkString(",")
    def unapply(s: String) = Some(s.split(","):_*)
}
val x2 = L2("4", "5", "6")
val L2(d,e,f) = x2
println("d=%s, e=%s, f=%s".format(d,e,f))
Run Code Online (Sandbox Code Playgroud)

但是这给出了错误:

error: no `: _*' annotation allowed here 
(such …
Run Code Online (Sandbox Code Playgroud)

scala variadic-functions unapply

13
推荐指数
1
解决办法
962
查看次数

Scala:指定默认泛型类型而不是Nothing

我有一对看起来像这样的课程.有一个Generator基于某些类级别值生成一个值,并GeneratorFactory构造一个Generator.

case class Generator[T, S](a: T, b: T, c: T) {
  def generate(implicit bf: CanBuildFrom[S, T, S]): S =
    bf() += (a, b, c) result
}

case class GeneratorFactory[T]() {
  def build[S <% Seq[T]](seq: S) = Generator[T, S](seq(0), seq(1), seq(2))
}
Run Code Online (Sandbox Code Playgroud)

你会注意到GeneratorFactory.build接受一个类型的参数SGenerator.generate产生一个类型的值S,但是没有类型S存储的类型Generator.

我们可以使用这样的类.工厂按顺序工作Char,并generate产生一个String因为build给出了一个String.

val gb = GeneratorFactory[Char]()
val g = gb.build("this string") …
Run Code Online (Sandbox Code Playgroud)

generics scala

13
推荐指数
1
解决办法
2835
查看次数

Scala:为什么我不能在一个字符集上映射一个接受Seq [Char]的函数

我可以定义一个接受a的函数 Seq[Char]

def f(s: Seq[Char]) = s
Run Code Online (Sandbox Code Playgroud)

如果我通过一个String:

scala> f("this")
res8: Seq[Char] = this
Run Code Online (Sandbox Code Playgroud)

这意味着我可以在一个map:

scala> List("this").map(s => f(s))
res9: List[Seq[Char]] = List(this)
Run Code Online (Sandbox Code Playgroud)

那我为什么不能这样做呢?:

scala> List("this").map(f)
<console>:10: error: type mismatch;
 found   : Seq[Char] => Seq[Char]
 required: java.lang.String => ?
              List("this").map(f)
                               ^
Run Code Online (Sandbox Code Playgroud)

scala implicit-conversion

13
推荐指数
1
解决办法
716
查看次数

在Scala中将列表或映射展开为函数参数

是否可以动态解包列表/元组/映射项作为Scala中函数的参数?我正在寻找一个Scala相当于Python的args/ kwargs.

例如,在Python如果一个函数定义为def foo(bar1, bar2, bar3=None, bar4=1)再给予一个列表x=[1,7]和字典y={'bar3':True, 'bar4':9}可以调用foofoo(*x, **y).

python scala

11
推荐指数
1
解决办法
5302
查看次数

flatMap行为在2.10.0中更改

我正在将一些代码从2.9转换为2.10,并遇到意外的编译错误.这是最小的形式:

在2.9.2中,这很好用:

scala> List(1).flatMap(n => Set(1).collect { case w => w })
res0: List[Int] = List(1)
Run Code Online (Sandbox Code Playgroud)

在2.10.0中,我们收到一个错误:

scala> List(1).flatMap(n => Set(1).collect { case w => w })
<console>:8: error: no type parameters for method flatMap: (f: Int => scala.collection.GenTraversableOnce[B])(implicit bf: scala.collection.generic.CanBuildFrom[List[Int],B,That])That exist so that it can be applied to arguments (Int => scala.collection.immutable.Set[_ <: Int])
 --- because ---
argument expression's type is not compatible with formal parameter type;
 found   : Int => scala.collection.immutable.Set[_ <: Int]
 required: Int => scala.collection.GenTraversableOnce[?B]
              List(1).flatMap(n …
Run Code Online (Sandbox Code Playgroud)

generics scala scala-2.10

10
推荐指数
1
解决办法
836
查看次数