abstract class Table {
private val records: Int
}
Run Code Online (Sandbox Code Playgroud)
是因为我们必须先创建一个抽象类的实例才能访问其私有成员吗?
为什么以下三个字符没有对称的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) 很有可能要知道函数是否在某个时刻定义,计算其价值的重要部分必须完成.在PartialFunction,在实现时isDefined和apply,这两种方法将不得不这样做.怎么办这个常见的工作成本很高?
有可能缓存其结果,希望在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]方法合理吗?在未来的版本中添加它听起来可行吗?它值得吗?
以下语句编译正常并按预期工作:
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) 我有一个包含类的简单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中有效:
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) 运行:
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)
你能解释一下吗?
我有以下代码行:
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.这为什么有用?
我有以下代码.
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的正确上下文.
如何在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)