在Java我通常会将我的整个域声明为interfaces,可能有一些Factory让我实现.这部分是因为我太老了我记得当一些持久层需要实现类来子类化特定类时,我也可以轻松地:
即使我没有真正想到我真的想要做上述任何一项,我也会遵循这种做法; 为了以防万一,我仍然认为这是一种很好的做法.我认为这是一种相当常见的方法.
如果我声明所有域对象,这在Scala-land中会不常见abstract吗?对于Scala,以上几点也适用吗?
来自一个Java背景,我已经习惯了处理集合的常见做法:显然会有异常,但通常代码看起来像:
public class MyClass {
private Set<String> mySet;
public void init() {
Set<String> s = new LinkedHashSet<String>();
s.add("Hello");
s.add("World");
mySet = Collections.unmodifiableSet(s);
}
}
Run Code Online (Sandbox Code Playgroud)
我不得不承认,我对Scala中的众多选项感到有些困惑.有:
scala.List(和Seq)scala.collections.Set(和Map)scala.collection.immutable.Set(而且Map,Stack不是List)scala.collection.mutable.Set(而且Map,Buffer不是List)scala.collection.jcl所以问题!
List并且Seq在包中定义scala而不是 scala.collection(尽管实现Seq是在集合子包中)?unmodifiable)?MultiMap)仅定义为可变?(没有不可改变的MultiMap)?我经常发现自己有一种Option[T]类型,T并希望测试选项的价值对某些价值.例如:
val opt = Some("oxbow")
if (opt.isDefined && opt.get == "lakes")
//do something
Run Code Online (Sandbox Code Playgroud)
以下代码是等效的,并删除了测试选项值是否存在的要求
if (opt.map(_ == "lakes").getOrElse(false))
//do something
Run Code Online (Sandbox Code Playgroud)
然而,这对我来说似乎不太可读.其他可能性是:
if (opt.filter(_ == "lakes").isDefined)
if (opt.find(_ == "lakes").isDefined) //uses implicit conversion to Iterable
Run Code Online (Sandbox Code Playgroud)
但我不认为这些明确表达的意图要么更好,因为:
if (opt.isDefinedAnd(_ == "lakes"))
Run Code Online (Sandbox Code Playgroud)
有没有人有更好的方法来做这个测试?
回复到我最近的问题表明,一个演员处理其消息一次一个.这是真的?我没有看到任何明确说明(在Scala中编程),其中包含以下代码段(第593页)
如果[
react方法]找到可以处理的消息,[it]将调度该消息的处理以便以后执行并抛出异常
(强调我自己).两个相关(和互斥)的问题:
receive?)编辑:做一些测试似乎证明我错了,演员确实是连续的.所以问题#2我需要回答
我可以按如下方式分配一个元组:
var (min, max) = (1, 2)
Run Code Online (Sandbox Code Playgroud)
但我不能再重新分配如下
(min, max) = (1, 3) //compiler error: ';' expected but '=' found
Run Code Online (Sandbox Code Playgroud)
相反,我似乎必须这样做:
min = 1
max = 3
Run Code Online (Sandbox Code Playgroud)
为什么后者不起作用而前者不起作用?
继我提出的另一个问题,Scala 2.8突破之后,我想了解更多关于Scala方法的信息,TraversableLike[A].map其签名如下:
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
Run Code Online (Sandbox Code Playgroud)
请注意有关此方法的一些事项:
A,将遍历中的每个转换为a B.That并采用类型的隐式参数CanBuildFrom[Repr, B, That].我可以这样称呼如下:
> val s: Set[Int] = List("Paris", "London").map(_.length)
s: Set[Int] Set(5,6)
Run Code Online (Sandbox Code Playgroud)
什么我不能很好地领会是怎么说的事实That是必然要B(即,它是B的一些集合)是由编译器执行.类型参数看起来独立于上面的签名和特征CanBuildFrom本身的签名:
trait CanBuildFrom[-From, -Elem, +To]
Run Code Online (Sandbox Code Playgroud)
Scala编译器如何确保That不会强制进入没有意义的东西?
> val s: Set[String] = List("Paris", "London").map(_.length) //will not compile
Run Code Online (Sandbox Code Playgroud)
编译器如何确定CanBuildFrom调用范围内的隐式对象是什么?
我有两个列表,a List[A]和a List[B].我想要的是一个,Map[A,B]但我想要的语义zip.所以从这样开始:
var tuplesOfAB = listOfA zip listOfB
Run Code Online (Sandbox Code Playgroud)
现在我不知道如何构建一个Map来自我的tuplesOfAB.
作为一个后续问题,我也想反转我的地图,以便从Map[A,B]我可以创建一个Map[B,A].任何人都可以用线索打我吗?
我最近一直在四处寻找在业余时间学习一门新语言,而Scala似乎非常有吸引力.
我有几个问题:
不知道Java在学习方面有什么挑战吗?以后这会是一个很大的劣势吗?(即人们多久依赖特定于Java的库?)
与Ruby相比有多大的不同?(除了静态类型)它是否引入了许多新术语,还是我熟悉大多数语言的机制?
你会推荐什么资源?我有我的眼睛Programming Scala
和Beginning Scala书本
虽然主观,Scala有趣的程序吗?:P
谢谢