相关疑难解决方法(0)

在Scala中创建使用枚举作为键的Map的语法是什么?

请看下面的代码.Eclipse将此行标记为不正确:

var map = Map[MyEnum,Point]()
Run Code Online (Sandbox Code Playgroud)

我试图做scala相当于Java:

private enum Letters{ A,B,C}
private Map<Letters,Integer> thing= new HashMap<Letters,Integer> ();
Run Code Online (Sandbox Code Playgroud)

这是写入它的文件/上下文.

class Point(var x:Int = 0, var y:Int = 0, var hasBeenSet:Boolean = false){

}

object MyEnum extends Enumeration{
    MyEnum = Value
    val UL,U,UR,L,R,DL,D,DR = Value
}

object MyEnumHolder {
  var map = Map[MyEnum,Point]()
  MyEnum.values.foreach(x => (map + (x -> new Point()) ) 
}
Run Code Online (Sandbox Code Playgroud)

我试图初始化一个映射的实例,枚举的每个值映射到一个空点(这是每个循环中发生的事情).

编辑:不得不编辑,因为我搞砸了一些编辑粘贴的代码,但它现在应该是有效的

scala

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

将案例类密封起来是一种好习惯吗?

密封类的主要原因似乎是,这允许编译器在对这些类进行模式匹配时进行彻底搜索.假设我有用于模式匹配的数据类型.玩具示例:

sealed trait Statement
case class Assign(name: String, value: Int) extends Statement
case class Print(name: String) extends Statement
case class IfZero(name: String, thenn: Statement, els: Option[Statement]) extends Statement
case class Block(statements: List[Statement]) extends Statement
Run Code Online (Sandbox Code Playgroud)

这些类的用例是通过模式匹配来使用它们:

def execute(statement: Statement): Unit = statement match {
    case Assign(name, value)      => ???
    case Print(name)              => ???
    case IfZero(name, thenn, els) => ???
    case Block(statements)        => statements foreach { execute(_) }
  }
Run Code Online (Sandbox Code Playgroud)

为此,Statement特性是sealed这样的,如果我在match语句中忘记了一个语句类型,编译器可以发出警告.但案例类怎么样?案例类不能相互继承,但特征和普通类可以.那么,密封案例类也是一种好的做法吗?如果我不这样做可能会出错?

scala

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

scala和java枚举之间的差异

在SO上读到了一个答案,其中有人说scala枚举是无用的,如果你真的需要,你应该只使用java枚举.

虽然我之前使用过java枚举,但我不能说我完全理解它们,因为我在日常工作中不用java编码.

有人可以解释scala和java枚举之间的区别,以及scala枚举中的缺点究竟在哪里?

java enumeration scala

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

获取Scala中的所有枚举案例对象值

在Scala中,枚举是一个有争议的领域,许多人(包括我自己)使用case objects 而不是任何基于库的枚举.这很好,除了那个没有得到所有可能值的列表,有时需要它.我allKeys手动维护了这样的列表(),但这很乏味且容易出错.

问题是:如何使用Scala 2.11 TypeTags或反射来创建这样的列表?

两种方法之一可行:

  • 得到一个所有衍生的实例sealed
  • case object在特定对象中声明所有声明

注意:有些样本似乎可以保证我正在寻找的东西.但这太过分了 - 必须有一个几乎一个班轮才能得到相同的东西?

以下是对此的测试.我怎么能实现这个allOf功能?

class ManifestToolsTest extends UnitTest {

  behavior of "ManifestTools" {

    sealed class MyEnum

    object MyEnum {
      case object A extends MyEnum
      case object B extends MyEnum
      case object C extends MyEnum

      val x= 10           // should not be listed
      def f(x: Int) = x   // should not be listed
    }

    def allOf[T]: Seq[T] = { …
Run Code Online (Sandbox Code Playgroud)

reflection macros enums scala

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

为什么Scala有案例对象?

它不能用参数进行初始化,只能与自身进行比较(单例).所以它的equals和hash代码函数没有优势.有没有人遇到过他们认为有用的案例?

scala

5
推荐指数
2
解决办法
2160
查看次数

在Scala中创建星期枚举的简明方法

我是Scala的新手,所以请好好的.如果我遗漏了一些明显的东西,你不得不原谅我.

我正在尝试创建一个类似枚举的结构来表示Scala中一周的日子.我想要一个方法,接受一个字符串,可以是数字1到7,当天的全名,或三个字母的缩写,任何大小写,并返回正确的一天.理想情况下,我希望能够通过写作来检索正确的日子DayOfWeek(_),据我所知,事情意味着这种方法需要apply.单个值也必须是一个被调用的特征的子类(或混合),目前这个特征CalendarField不定义任何方法或成员.

这是我目前的尝试:

object DayOfWeek extends Enumeration with CalendarField {

    val Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday = Value

    def apply(v:String) = {
        v.toUpperCase match {
            case Int(x) => x match {
                case 1 => Sunday
                case 2 => Monday
                case 3 => Tuesday
                case 4 => Wednesday
                case 5 => Thursday                  
                case 6 => Friday
                case 7 => Saturday
                case _ => throw new IllegalArgumentException("Invalid value for day of week: " + …
Run Code Online (Sandbox Code Playgroud)

enums scala

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

Scala/Java枚举

我已经读过这个这个,但我仍然不理解在Scala中这样做的(惯用的)等效方法

enum Status { 
    OK(1, "Ok", "Okay"),
    NOT_OK(5, "Not Ok", "Not Okay")
    BAD(10, "Bad", "Run for your life")

    int code;
    String name;
    String description; // custom fields

    Status(int code, String name, String description) {
        this.code = code;
        this.name = name;
        this.description = description;
    }
}

class Main {
    public static void main(String[] args) {
        for(Status status : Status.values) { // iterate through them
            doStuff(status);
        }
    }

    private doStuff(Status status) {
        System.out.println(status.description);
        // and more
    }
}
Run Code Online (Sandbox Code Playgroud)

java enums scala idiomatic

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

标签 统计

scala ×7

enums ×3

java ×2

enumeration ×1

idiomatic ×1

macros ×1

reflection ×1