我无法理解Option[T]Scala中的课程要点.我的意思是,我不能看到任何advanages None了null.
例如,考虑代码:
object Main{
class Person(name: String, var age: int){
def display = println(name+" "+age)
}
def getPerson1: Person = {
// returns a Person instance or null
}
def getPerson2: Option[Person] = {
// returns either Some[Person] or None
}
def main(argv: Array[String]): Unit = {
val p = getPerson1
if (p!=null) p.display
getPerson2 match{
case Some(person) => person.display
case None => /* Do nothing */
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在假设,该方法getPerson1返回null …
我正在通过Scala中的Programming工作,虽然我很想从Python的角度来看待事物,但我不想编写"Scala中的Python".
就控制流程来说,我不太清楚要做什么:在Python中,我们习惯于for x in some_iterable死亡,我们喜欢它.Scala中存在一个非常相似的构造,Odersky调用for 表达式,可能是为了将它与Java for循环区分开来.此外,foreach对于可迭代数据类型,Scala有一个属性(我想它将是一个属性,我不太了解Scala的名称).但是,foreach除了为容器中的每个项调用一个函数之外,似乎我不能做更多的工作.
这给我留下了一些问题.首先,表达式是Scala中的重要/大量使用的构造,就像它们在Python中一样;其次,我何时应该使用foreach而不是for表达式(除了在容器的每个项目上调用函数的明显情况之外)?
我希望我不是非常暧昧或过于宽泛,但我只想尝试Scala中的一些设计/语言基础(到目前为止看起来非常酷).
语言指南没有透露列表理解的痕迹.在Swift中实现这一目标的最佳方法是什么?我正在寻找类似的东西:
evens = [ x for x in range(10) if x % 2 == 0]
Run Code Online (Sandbox Code Playgroud) 如何yield return使用Scala continuation 实现C#?我希望能够以Iterator相同的风格编写Scala .这篇Scala新闻帖的评论中有一个刺,但它不起作用(尝试使用Scala 2.8.0测试版).一个相关问题的答案表明这是可能的,但是虽然我已经玩了一段时间的分隔延续,但我似乎无法完全理解如何做到这一点.
我是Scala的新手,据我所知,Scala中的收益与C#中的收益不同,它更像是选择.
Scala有类似于C#的收益吗?C#的收益很好,因为它使编写迭代器变得非常容易.
更新:这是来自C#的伪代码示例,我希望能够在Scala中实现:
public class Graph<T> {
public IEnumerable<T> BreadthFirstIterator() {
List<T> currentLevel = new List<T>();
currentLevel.add(_root);
while ( currentLevel.count > 0 ) {
List<T> nextLevel = new List<T>();
foreach( var node in currentLevel ) {
yield return node;
nextLevel.addRange( node.Children );
}
currentLevel = nextLevel;
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码实现了图的迭代广度优先遍历,使用yield,它返回一个迭代器,以便调用者可以使用常规for循环遍历图,例如:
graph.BreadthFirstIterator().foreach( n => Console.WriteLine( n ) );
Run Code Online (Sandbox Code Playgroud)
在C#中,yield只是语法糖,可以很容易地编写迭代器(IEnumerable<T>在.Net中,类似于IterableJava).作为迭代器,它的评估很懒散.
更新II:我可能在这里错了,但我认为C#中的整个收益点是你不必编写更高阶函数.例如,你可以编写一个常规for循环或使用像select/ map/ filter/ 这样的方法,where而不是传入一个函数,然后遍历序列.
如graph.iterator().foreach(n => println(n))代替graph.iterator( …
当我for在Scala中评估一个时,我得到一个不可变的IndexedSeq(一个具有类似数组的性能特征的集合,例如高效的随机访问):
scala> val s = for (i <- 0 to 9) yield math.random + i
s: scala.collection.immutable.IndexedSeq[Double] = Vector(0.6127056766832756, 1.7137598183155291, ...
Run Code Online (Sandbox Code Playgroud)
是for一个yield总是返回一个IndexedSeq,还是它还可以返回一些其他类型的集合类(LinearSeq例如,a)?如果它还可以返回其他内容,那么什么决定了返回类型,我该如何影响它呢?
我正在使用Scala 2.8.0.RC3.
我正在将我的一些Python代码翻译成Scala,我想知道是否有类似Python的列表理解:
[x for x in list if x!=somevalue]
Run Code Online (Sandbox Code Playgroud)
基本上我正试图从列表中删除某些元素,如果匹配的话.
我正在为博士研究编写代码并开始使用Scala.我经常要做文字处理.我已经习惯了Python,其'yield'语句对于在大型(通常是不规则结构化的)文本文件上实现复杂的迭代器非常有用.类似的结构存在于其他语言(例如C#)中,这是有充分理由的.
是的我知道之前有过这样的线索.但它们看起来像是黑客攻击(或至少解释得很糟糕)的解决方案,这些解决方案并不能很好地运作并且通常具有不明确的局限性.我想编写这样的代码:
import generator._
def yield_values(file:String) = {
generate {
for (x <- Source.fromFile(file).getLines()) {
# Scala is already using the 'yield' keyword.
give("something")
for (field <- ":".r.split(x)) {
if (field contains "/") {
for (subfield <- "/".r.split(field)) { give(subfield) }
} else {
// Scala has no 'continue'. IMO that should be considered
// a bug in Scala.
// Preferred: if (field.startsWith("#")) continue
// Actual: Need to indent all following code
if (!field.startsWith("#")) {
val some_calculation = { ... …Run Code Online (Sandbox Code Playgroud) 当我第一次开始关注Scala时,我喜欢看起来很容易理解.它们似乎有点像我从Java 5习惯的foreach循环,但具有功能限制和很多甜美的语法好处.
但正如我已经吸收了Scala的风格,我发现我每次可以使用一个换comprension我使用map,flatMap,filter,reduce和foreach来代替.代码的意图对我来说似乎更清晰,潜在的隐藏意外更少,而且它们通常也是更短的代码.
据我所知,无论如何,for-comprehension总是编译成这些方法,所以我想知道:它们实际上是为了什么?我错过了一些功能性的复兴(这不是第一次)?为了理解做其他功能不能做的事情,或者至少会笨拙地做些什么?他们是否根据特定用例发光?这真的只是个人品味的问题吗?
我真的很喜欢
for (line <- Source fromFile inputPath getLines) {doSomething line}
Run Code Online (Sandbox Code Playgroud)
用于迭代scala中的文件的构造,我想知道是否有一种方法可以使用类似的构造来迭代目录中所有文件中的行.
这里的一个重要限制是所有文件都会增加一定量的空间,从而产生堆溢出.(想想几十GB,所以增加堆大小不是一个选项)作为暂时的解决方案,我一直在把每个人整合成一个文件,并使用上述结构,这是懒惰的b/c.
重点是,这似乎引起了诸如......之类的问题.我可以连接两个(百个)惰性迭代器并获得一个非常大的,非常懒的吗?