小编Did*_*ont的帖子

抽象类,为什么我们不能声明私有val和var类成员?

abstract class Table {
  private val records: Int
}
Run Code Online (Sandbox Code Playgroud)

是因为我们必须先创建一个抽象类的实例才能访问其私有成员吗?

scala

13
推荐指数
2
解决办法
2380
查看次数

具有不对称大写/小写的Unicode字符.为什么?

为什么以下三个字符没有对称的toLower,toUpper结果

/**
  * Written in the Scala programming language, typed into the Scala REPL.
  * Results commented accordingly.
  */
/* Unicode Character 'LATIN CAPITAL LETTER SHARP S' (U+1E9E) */
'\u1e9e'.toHexString == "1e9e" // true
'\u1e9e'.toLower.toHexString == "df" // "df" == "df"
'\u1e9e'.toHexString == '\u1e9e'.toLower.toUpper.toHexString // "1e9e" != "df"
/* Unicode Character 'KELVIN SIGN' (U+212A) */
'\u212a'.toHexString == "212a" // "212a" == "212a"
'\u212a'.toLower.toHexString == "6b" // "6b" == "6b"
'\u212a'.toHexString == '\u212a'.toLower.toUpper.toHexString // "212a" != "4b" …
Run Code Online (Sandbox Code Playgroud)

regex unicode scala lowercase uppercase

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

在PartDefine的定义和应用中都会出现代价高昂的计算

很有可能要知道函数是否在某个时刻定义,计算其价值的重要部分必须完成.在PartialFunction,在实现时isDefinedapply,这两种方法将不得不这样做.怎么办这个常见的工作成本很高?

有可能缓存其结果,希望在isDefined之后调用apply.绝对丑陋.

我经常希望那PartialFunction[A,B]Function[A, Option[B]],这显然是同构的.或许,可能还有另一种方法PartialFunction,比方说applyOption(a: A): Option[B].对于一些mixins,实现者可以选择实现isDefined和apply或applyOption.或者所有这些都是安全的,性能明智.isDefined在呼叫申请之前进行测试的客户将被鼓励使用applyOption.

但事实并非如此.库中的一些主要方法,其中包括collect集合中的一些PartialFunction.是否有一种干净(或不那么干净)的方式来避免支付isDefined和apply之间重复的计算?

另外,applyOption(a: A): Option[B]方法合理吗?在未来的版本中添加它听起来可行吗?它值得吗?

scala

8
推荐指数
1
解决办法
426
查看次数

无法使用动态mixin类型为键添加成员到Map

以下语句编译正常并按预期工作:

val map : Map[_ >: Int with String, Int] = Map(1 -> 2, "Hello" -> 3)
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试添加到地图:

map + ((3,4))
Run Code Online (Sandbox Code Playgroud)

要么

map + (("Bye", 4))
Run Code Online (Sandbox Code Playgroud)

然后我得到一个类型不匹配:

发现:java.lang.String("Bye")

required:_ $ 1其中type _ $ 1>:Int with String

如果我弱化类型签名以允许Any作为Key的类型,那么这一切都按预期工作.

我的直觉说这与Map的键类型的不变性有关,并且_ $ 1在某种程度上被固定为特定的超类型Int with String,但我对此并不特别满意.谁能解释一下发生了什么?

编辑添加:

如果您想知道这出现在哪里,那么如果您执行以下操作,则会获得签名:

val map = if (true) Map(1 -> 2) else Map("1" -> 2)
Run Code Online (Sandbox Code Playgroud)

types scala mixins variance

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

Scala - 动态类加载 - 类A不能转换为A类

我有一个包含类的简单jar文件A:

public class A {}
Run Code Online (Sandbox Code Playgroud)

然后我在运行时加载它:

var classLoader = new URLClassLoader(Array(my_jar_file.toURI.toURL))
var clazz = classLoader.loadClass("A")
Run Code Online (Sandbox Code Playgroud)

没关系,它可以加载课程A.这个命令也可以:

clazz.newInstance
Run Code Online (Sandbox Code Playgroud)

但当我把它投射到A:

clazz.newInstance.asInstanceOf[A]
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

java.lang.ClassCastException: A cannot be cast to A
Run Code Online (Sandbox Code Playgroud)

请你帮助我好吗?

scala class loading dynamic classloader

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

Scala列表包含vs数组包含

出于兴趣,为什么这在Scala中有效:

val exceptions = List[Char]('+')    
assertTrue(exceptions.contains('+'))
Run Code Online (Sandbox Code Playgroud)

但这不是

val exceptions = new Array[Char]('+')    
assertTrue(exceptions.contains('+'))
Run Code Online (Sandbox Code Playgroud)

scala

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

Scala Stream混乱

运行:

lazy val s: Stream[Int] = 1 #:: 2 #:: {val x = s.tail.map(_+1); println("> " + x.head); x}
s.take(5).toList
Run Code Online (Sandbox Code Playgroud)

我期待:

> List(2, 3)
> List(2, 3, 4)
List(1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)

我得到:

> 3
List(1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)

你能解释一下吗?

recursion scala tail stream

5
推荐指数
1
解决办法
327
查看次数

Scala Set [_] vs Set [Any]

我有以下代码行:

case set: Set[Any] => setFormat[Any].write(set)
Run Code Online (Sandbox Code Playgroud)

但是,编译器会发出警告:

非变量类型参数类型模式中的任何类型scala.collection.Set [Any]未选中,因为它被擦除消除[warn]

很公平.

所以我改变了我的路线:

case set: Set[_] => setFormat[Any].write(set)
Run Code Online (Sandbox Code Playgroud)

现在我收到一个错误:

[错误]发现:scala.collection.Set [_]

[error] required:scala.collection.Set [Any]

Q1.这两者有什么区别?

然后我将我的代码更改为以下内容:

case set: Set[_] => setFormat[Any].write(set.map(s => s))
Run Code Online (Sandbox Code Playgroud)

现在很高兴没有任何错误或警告.

Q2.这为什么有用?

scala

5
推荐指数
1
解决办法
194
查看次数

为什么Scala编译器在可变列表上应用foreach时抛出IndexOutOfBoundException

我有以下代码.

import scala.collection.mutable.MutableList
val x = MutableList[Int]()
(1 to 10).foreach(x+=1)
Run Code Online (Sandbox Code Playgroud)

我收到了java.lang.IndexOutOfBoundsException: 1错误.

但,

(1 to 10).foreach(println) this does not throw any error.
Run Code Online (Sandbox Code Playgroud)

indexOutOfBoundException可以通过使用lambda操作如下解决:

(1 to 10).foreach(_ => x+=1)
Run Code Online (Sandbox Code Playgroud)

这一切都很好.

我的问题是:
1.为什么我需要在第一种情况下使用lambda运算符而不像第二种情况?
2.为什么编译器抛出IndexOutOfBoundException,我想这不是这个Exception的正确上下文.

collections scala

4
推荐指数
1
解决办法
143
查看次数

如何确保Scala中的for-comprehension中的资源被关闭

如何在Scala中进行for-understandingnce中最好地处理带有副作用的函数?

我有一个理解,通过调用函数f1创建一种资源(x)开始.这个资源有一个close -method需要在结束时调用,但是如果for-comprehension以某种方式失败(除非.

所以我们有类似的东西:

import scala.util.{Try,Success,Failure}

trait Resource {
  def close() : Unit
}

// Opens some resource and returns it as Success or returns Failure
def f1 : Try[Resource] = ...
def f2 : Try[Resource] = ...

val res = for {
  x <- f1
  y <- f2
} yield {
  (x,y)
}
Run Code Online (Sandbox Code Playgroud)

我应该在哪里调用close方法?我可以在for-comprehension结束时将其称为最后一个语句(z < - x.close),在yield-part中,或在for-comprehension之后(res._1.close).它们都不能确保在发生错误时调用close(例如,如果f2失败).或者,我可以分开

x <- f1 
Run Code Online (Sandbox Code Playgroud)

出于这样的理解:

val res = f1
res match {
  case Success(x) …
Run Code Online (Sandbox Code Playgroud)

scala

4
推荐指数
1
解决办法
905
查看次数