小编Ale*_*ack的帖子

Scala是否与C#yield相当?

我是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# scala yield

24
推荐指数
2
解决办法
5195
查看次数

有没有办法在Scala中使用带有命名字段的元组,类似于C#中的匿名类?

请参阅:我可以在C#中为匿名类指定有意义的名称吗?

在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中有这样的东西吗?

c# scala tuples

18
推荐指数
4
解决办法
2万
查看次数

Scala Eclipse插件的当前状态是什么?

当前的Scala Eclipse插件(http://www.scala-lang.org/node/94)是否可用?我一直在读它的不稳定和马车,甚至无法使用.

请参阅上一个主题:Scala的当前工具状态是什么?

我已经简单地尝试了一下,但仅限于琐碎的程序,到目前为止似乎很好.

谢谢!

更新:我将潜入并使用Scala和Eclipse完成一些工作,我会尝试报告并告诉您我发现的内容.

更新:请参阅下面的答案,了解我对Eclipse 3.5.1和Scala 2.7.7 Final的体验.

  • 亚历克斯

eclipse scala scala-ide

17
推荐指数
3
解决办法
6167
查看次数

Scala:通过生成器公开JDBC ResultSet(可迭代)

我在数据库中有一组行,我想提供一个接口来像这样旋转它们:

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)

有没有办法可以将其转换为不将整个集存储在内存中?也许我可以使用一个理解?

iterable scala jdbc

14
推荐指数
3
解决办法
6895
查看次数

Eclipse CDT:如何通过相对路径引用第三方包含

我是Eclipse-CDT的新手,第一次建立了一个新项目.我试图在没有硬编码绝对路径的情况下引用Boost .

我在工作区文件夹中添加了boost,例如/ home/user/workspace/boost_1_39_0

我当时希望添加一个指向相对于工作区的文件夹的include目录,但Eclipse不会这样做,它似乎只想指向/ home/user/workspace/[MyProjectNameHere]中的思考

有小费吗?将Boost复制到我的项目文件夹似乎没有意义,因为它出现在Eclipse中,而Eclipse想要构建它(当然,我可以将其排除).

  • 亚历克斯

c++ eclipse boost eclipse-cdt

13
推荐指数
2
解决办法
2万
查看次数

使用构造函数params在scala中扩展一个类会在类中添加vals(字段)吗?

说我有:

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)?

inheritance scala

11
推荐指数
2
解决办法
7912
查看次数

使用可滚动内容在CSS中创建可变高度"固定"标头

我想在页面上创建一个页眉,当您滚动页面时它不会移动.

这看起来很简单,只需在样式中添加"position:fixed",但随后内容会显示在标题下方,因为标题是"从流程中删除".所以我认为解决方案是在内容中添加"margin-top:height".

当标题的高度可变时,最好的解决方法是什么?

我有一个小提琴演示了这个问题:

http://jsfiddle.net/waterlooalex/j4Z8F/2/

提供你的浏览器窗口不是太大,内容文本将滚动到'hello world header'下面,问题是第一行文本"Lorem ipsum ..."被隐藏.我有一些注释掉javascript解决这个问题.

css header css-position

11
推荐指数
3
解决办法
6576
查看次数

如何使用Scala验证XML文件的模式?

我写了一个简单的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)

xml scala

10
推荐指数
1
解决办法
4918
查看次数

Scala: Pattern matching when one of two items meets some condition

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)

scala pattern-matching extractor

10
推荐指数
3
解决办法
1万
查看次数

如何使用涉及泛型的匿名类型调用泛型方法?

我有这个代码有效:

  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]被找到.

基本上:

  • 我想动态创建一个新的匿名类/实例(例如new …

generics scala type-inference

9
推荐指数
1
解决办法
948
查看次数