请看下面的代码.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)
我试图初始化一个映射的实例,枚举的每个值映射到一个空点(这是每个循环中发生的事情).
编辑:不得不编辑,因为我搞砸了一些编辑粘贴的代码,但它现在应该是有效的
密封类的主要原因似乎是,这允许编译器在对这些类进行模式匹配时进行彻底搜索.假设我有用于模式匹配的数据类型.玩具示例:
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语句中忘记了一个语句类型,编译器可以发出警告.但案例类怎么样?案例类不能相互继承,但特征和普通类可以.那么,密封案例类也是一种好的做法吗?如果我不这样做可能会出错?
我在SO上读到了一个答案,其中有人说scala枚举是无用的,如果你真的需要,你应该只使用java枚举.
虽然我之前使用过java枚举,但我不能说我完全理解它们,因为我在日常工作中不用java编码.
有人可以解释scala和java枚举之间的区别,以及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) 它不能用参数进行初始化,只能与自身进行比较(单例).所以它的equals和hash代码函数没有优势.有没有人遇到过他们认为有用的案例?
我是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) 我已经读过这个和这个,但我仍然不理解在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)