scala教程说,Int添加操作实际上是一种方法调用:1+1意思是1.+(1)
但是当我查看源代码时Int.scala,看起来该方法只会打印一条错误消息.任何人都可以向我解释这是如何工作的?
def +(x: Int): Int = sys.error("stub")
Run Code Online (Sandbox Code Playgroud) 当我想运行我的Scala项目时,我cd到项目目录并做
$ sbt "run arg1"
Run Code Online (Sandbox Code Playgroud)
如何从项目目录外执行相同的操作?
是否可以纯粹从泛型参数创建一个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框架中的方法.
有什么指针吗?
假设我有以下元组:
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?我真的在寻找一个结合任意大小的元组的一般答案,并意识到由于最大元组大小的上限会有限制.我特意寻找一个元组结果,而不是一个集合.
模式匹配是否可以检测某些东西是否是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不是东西,像超Int和Double,这是一个类型类.我也做不了什么,def equals[N: Numeric](o: N)因为o必须Any要符合合同equals.
那么我怎么做而不列出每个已知的Numeric类(包括,我想,用户定义的类我可能都不知道)?
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) 我有一对看起来像这样的课程.有一个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接受一个类型的参数S并Generator.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) 我可以定义一个接受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中函数的参数?我正在寻找一个Scala相当于Python的args/ kwargs.
例如,在Python如果一个函数定义为def foo(bar1, bar2, bar3=None, bar4=1)再给予一个列表x=[1,7]和字典y={'bar3':True, 'bar4':9}可以调用foo的foo(*x, **y).
我正在将一些代码从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)