对Scala 2.8收集行为感到非常沮丧.这是问题:我正在创建一个数独板.我将单元格从A1标记为I9(字母为行,数字为列).我想得到一块板上的单位,即9行,夜间列和夜间象限.
这是我的scala类:
class Square(val row:Char, val column:Int) extends Pair[Char, Int](row, column) {
override def toString() = "" + row + column
}
object Board {
private val rows = "ABCDEFGHI"
private val cols = 1 to 9
private lazy val units = unitList(rows, cols)
private def cross(rows:Iterable[Char], columns:Iterable[Int]):Iterable[Square] = {
for (row <- rows; col <- columns)
yield new Square(row, col)
}
private def unitList(rows:Iterable[Char], cols:Iterable[Int]) = {
val u1 = (for (col <- cols) yield cross(rows, List(col)))
val …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个函数,使用整数键将Maps转换为相应的数组.我已完成基本情况,但我正在尝试编写递归情况(即多维数组:将Map [Int,Map [Int,X]]转换为Array [Array [X]]).
这个任务产生于需要从流构造数组而不知道数组预先有多大,允许元素以随机顺序离开流的可能性以及重复元素离开流的可能性.
我有一个功能:
def toArrayHard[X:ClassManifest](x:scala.collection.Map[Int, X]):Array[X] =
{
if (x.size == 0) new Array(0)
else
{
val max:Int = 1 + x.keys.max
val a:Array[X] = new Array(max)
var i = 0
while (i < max)
{
a(i) = x(i)
i += 1
}
a
}
}
Run Code Online (Sandbox Code Playgroud)
注意,我知道如果地图包含密钥k但是不包含密钥i,其中0 <= i <k,代码将失败.这对我来说没问题.
现在我希望对任意深度的多维数组做同样的事情.例如,在Map [Int,Map [Int,X]]到Array [Array [X]]之间进行转换.不幸的是,我被这些类型绊倒了.使用以上作为基础案例,这是我到目前为止所拥有的:
def toArrayHardRec[X:ClassManifest](x:scala.collection.Map[Int, X]):Array[X] =
{
import scala.collection.Map
if (x.size == 0) new Array(0)
else
{
x match
{
case t:Map[Int, Map[Int, …Run Code Online (Sandbox Code Playgroud) 我正在使用Unfiltered 0.6.8(使用Jetty连接器)并遇到了一个奇怪的行为:路径段不是URL解码的.
以下代码是我的最小测试用例:
import unfiltered.request._
import unfiltered.response._
object Test extends App with unfiltered.filter.Plan {
def intent = {
case reg @ Path(Seg(test :: Nil)) =>
println(test)
ResponseString(test)
}
unfiltered.jetty.Http.local(8080).filter(Test).run()
}
Run Code Online (Sandbox Code Playgroud)
查询http://localhost:8080/some_string产生预期结果:some_string,在客户端和服务器端.
另一方面,客户端和服务器上的http://localhost:8080/some%20string产量some%20string,而不是some string我期待的.
解决这个问题很简单(java.net.URLDecoder#decode(String, String)),但我想知道是否:
作为旁注,unfiltered标签不存在,我没有足够的声誉来创建它,这就是我违约的原因scala.
我将 Scala 3 的编译器称为库,它CompilationUnit在编译后为您提供每个源代码。它有tpdTree,听起来应该包含类型信息。
我正在尝试遍历树来获取任何类型符号:
atPhase(Phases.typerPhase.next) {
// traverse unit.tpdTree...
}
Run Code Online (Sandbox Code Playgroud)
树行走看起来像:
class ValExtractor(tpes: Set[String]) extends tpd.TreeTraverser:
def isAcceptableType(tpe: Types.Type)(using ctx: Context): Boolean =
tpe.baseClasses.exists { sym =>
tpes.contains(sym.fullName.toString)
}
override def traverse(tree: tpd.Tree)(using ctx: Context): Unit =
tree match
case tpd.ValDef(name, tpt, _) if isAcceptableType(tpt.tpe) =>
println("do something")
case t: tpd.Template => this((), t.body)
case t: tpd.PackageDef => this((), t.stats)
case t: tpd.TypeDef => this((), t.rhs)
case _ => ()
end ValExtractor
Run Code Online (Sandbox Code Playgroud)
我明白了
[info] assertion …Run Code Online (Sandbox Code Playgroud) 为什么我不能加入scala.collection.Map?如果trait没有这个功能,这似乎毫无用处.
难道他们不能覆盖++方法Iterable并将返回类型减少为Map?
PS我并不是说它应该是可变的,只是它应该能够返回一个Map带有添加映射(或映射)的新函数,就像它一样immutable.Map.
根据Map对象上map方法的scaladoc,它应该返回一个新的Map:
def map [B] (f: ((A, B)) ? B) : Map[B]
Run Code Online (Sandbox Code Playgroud)
"返回一个新的地图,该地图是将给定的函数f应用于此地图的每个元素并收集结果."
但它没有:
scala> val countries = Map("NO" -> "Norway", "US" -> "United States", "DE" -> "Germany")
countries: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map((NO,Norway), (US,United States), (DE,Germany))
countries map { _._1 }
res4: scala.collection.immutable.Iterable[java.lang.String] = List(NO, US, DE)
Run Code Online (Sandbox Code Playgroud)
但是,这种行为是我所期望的.那么文档是错误的,还是我错过了什么?