小编Eug*_*ota的帖子

Scala集合:完全不可预测的行为

对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)

scala yield scala-2.8 scala-collections

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

递归地将Map [Int,Map [Int,X]]转换为Array [Array [X]]

我正在尝试编写一个函数,使用整数键将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)

arrays maps scala generic-programming scala-collections

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

未经过滤的URL解码

我正在使用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 unfiltered

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

Scala 3:“断言失败:表示类 Int 在运行 1 中无效。”

我将 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 scala-3

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

scala collection.Map无法添加到

为什么我不能加入scala.collection.Map?如果trait没有这个功能,这似乎毫无用处.

难道他们不能覆盖++方法Iterable并将返回类型减少为Map

PS我并不是说它应该是可变的,只是它应该能够返回一个Map带有添加映射(或映射)的新函数,就像它一样immutable.Map.

scala map scala-collections

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

斯卡拉多克在地图上的地图

根据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)

但是,这种行为是我所期望的.那么文档是错误的,还是我错过了什么?

scala scala-collections

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