我是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( …
在C#中你可以写:
var e = new { ID = 5, Name= "Prashant" };
assertEquals( 5, e.ID )
Run Code Online (Sandbox Code Playgroud)
但在Scala中我最终写道:
var e = (5, "Prashant")
assertEquals( 5, e._1 )
Run Code Online (Sandbox Code Playgroud)
Scala通过使用泛型来保持类型安全(就像C#一样),但是丢失了每个字段名称的可读性,例如我使用"_1"而不是"ID".
Scala中有这样的东西吗?
当前的Scala Eclipse插件(http://www.scala-lang.org/node/94)是否可用?我一直在读它的不稳定和马车,甚至无法使用.
请参阅上一个主题:Scala的当前工具状态是什么?
我已经简单地尝试了一下,但仅限于琐碎的程序,到目前为止似乎很好.
谢谢!
更新:我将潜入并使用Scala和Eclipse完成一些工作,我会尝试报告并告诉您我发现的内容.
更新:请参阅下面的答案,了解我对Eclipse 3.5.1和Scala 2.7.7 Final的体验.
我在数据库中有一组行,我想提供一个接口来像这样旋转它们:
def findAll: Iterable[MyObject]
Run Code Online (Sandbox Code Playgroud)
我们不需要同时在内存中包含所有实例.在C#中,您可以使用yield轻松创建这样的生成器,编译器负责将循环通过记录集的代码转换为迭代器(将其反转).
我当前的代码如下所示:
def findAll: List[MyObject] = {
val rs = getRs
val values = new ListBuffer[MyObject]
while ( rs.next() )
values += new valueFromResultSet(rs)
values.toList
}
Run Code Online (Sandbox Code Playgroud)
有没有办法可以将其转换为不将整个集存储在内存中?也许我可以使用一个理解?
我是Eclipse-CDT的新手,第一次建立了一个新项目.我试图在没有硬编码绝对路径的情况下引用Boost .
我在工作区文件夹中添加了boost,例如/ home/user/workspace/boost_1_39_0
我当时希望添加一个指向相对于工作区的文件夹的include目录,但Eclipse不会这样做,它似乎只想指向/ home/user/workspace/[MyProjectNameHere]中的思考
有小费吗?将Boost复制到我的项目文件夹似乎没有意义,因为它出现在Eclipse中,而Eclipse想要构建它(当然,我可以将其排除).
说我有:
class A(val foo: String)
class B(foo: String) extends A(foo)
class C(val foo: String) extends A(foo)
class D(override val foo: String) extends A(foo)
class E(bar: String) extends A(bar)
Run Code Online (Sandbox Code Playgroud)
我对每个类的内存实例占用多少感兴趣.A类的实例将具有单个成员变量:foo.
B,C,D和E班怎么样?他们各有几个成员变量?我怀疑E会有两个(E.bar,A.foo),我希望D会有一个(A.foo),但我想知道B和C,他们可能有两个吗?(B.foo,A.foo)?
我想在页面上创建一个页眉,当您滚动页面时它不会移动.
这看起来很简单,只需在样式中添加"position:fixed",但随后内容会显示在标题下方,因为标题是"从流程中删除".所以我认为解决方案是在内容中添加"margin-top:height".
当标题的高度可变时,最好的解决方法是什么?
我有一个小提琴演示了这个问题:
http://jsfiddle.net/waterlooalex/j4Z8F/2/
提供你的浏览器窗口不是太大,内容文本将滚动到'hello world header'下面,问题是第一行文本"Lorem ipsum ..."被隐藏.我有一些注释掉javascript解决这个问题.
我写了一个简单的scala程序来打开一个XML文件.
有没有办法让scala根据它引用的模式文件验证XML文件?目前我的XML文件不遵循架构,所以我希望在验证时出错.
XML文件在根元素中引用这样的模式:
<items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="items.xsd">
Run Code Online (Sandbox Code Playgroud)
scala代码:
import scala.xml._
object HelloWorld {
def main(args: Array[String]) {
println("Hello, world! " + args.toList)
val start = System.currentTimeMillis
val data = XML.loadFile(args(0))
val stop = System.currentTimeMillis
Console.println("Took " + (stop-start)/1000.0 + "s to load " + args(0))
}
}
HelloWorld.main(args)
Run Code Online (Sandbox Code Playgroud) I'm often writing code that compares two objects and produces a value based on whether they are the same, or different, based on how they are different.
So I might write:
val result = (v1,v2) match {
case (Some(value1), Some(value2)) => "a"
case (Some(value), None)) => "b"
case (None, Some(value)) => "b"
case _ = > "c"
}
Run Code Online (Sandbox Code Playgroud)
Those 2nd and 3rd cases are the same really, so I tried writing:
val result = (v1,v2) match {
case (Some(value1), Some(value2)) …Run Code Online (Sandbox Code Playgroud) 我有这个代码有效:
def testTypeSpecialization: String = {
class Foo[T]
def add[T](obj: Foo[T]): Foo[T] = obj
def addInt[X <% Foo[Int]](obj: X): X = {
add(obj)
obj
}
val foo = addInt(new Foo[Int] {
def someMethod: String = "Hello world"
})
foo.someMethod
}
Run Code Online (Sandbox Code Playgroud)
但是,我想这样写:
def testTypeSpecialization: String = {
class Foo[T]
def add[X, T <% Foo[X](obj: T): T = obj
val foo = add(new Foo[Int] {
def someMethod: String = "Hello world"
})
foo.someMethod
}
Run Code Online (Sandbox Code Playgroud)
第二个无法编译:
没有隐式参数匹配参数类型(Foo [Int] {...})=> Foo [Nothing]被找到.
基本上: