2011-03-24 74 views
1

我刚开始学习scala,也许我有点野心。我想将String映射到从StringBoolean的函数。不幸的是,我并不了解我从编译器得到的反馈。下面是代码:斯卡拉函数图

所有的
class StdRead { 
    def read(key : Array[Int], value : Array[Int],seperator : Array[Char], 
     filter : Map[Int, String => Boolean], write : String => Unit) { 
    for(ln <- stdin.getLines) { 
     val inarr = ln split seperator 
     for(i <- key) { 
      val func = filter get i //func : Option[(String) => Boolean] 
      val f = func getOrElse Unit //f : java.lang.Object 
      val res = func(inarr(i)) //Error, doesn't work 
     } 
     //more stuff   
    } 
} 

第一,为什么我得到一个Option,是唯一的方式来访问该功能。其次,getOrElse为什么返回一个对象?难道这不是我可以用来调用函数的东西吗?如果有人能给我一个简单的例子来说明我在这里需要做什么,那将是非常棒的。

在此先感谢。

+0

顺便说一句,它是“sepArator”,而不是“sepErator”。 – 2011-03-24 20:34:36

+1

@ DanielC.Sobral有些人有不同的文化,我认为你的文化是事实上的,它是以民族为中心的。就像OP一样,我也是来自有时使用E形式而不是A形式的文化。 – bharal 2013-07-18 15:17:22

+0

@bharal对不起,如果你有这种感觉。我找不到任何字典显示“分隔符”是正确的拼写。我看不出有什么理由不帮助其他人改善拼写错误。你不应该因为帮助别人而责备我,你应该帮助我,通过给出这些拼写和参考文献的实际例子来证实这确实是对你的文化的有效拼写,而不是你的错误。 – 2013-07-19 18:01:38

回答

3

如果您确定某个地图上有某个关键字,您可以直接抓住它:filter(i)。如果您不确定(或者更加小心错误),则使用get方法。它返回一个选项,您已经从中正确决定使用getOrElse。但是,您想要getOrElse((s:String) => /* some boolean */),也就是说,您还必须从那里返回StringBoolean的函数。然后,您可以应用f,这将是从地图中成功获取的功能,或者您在getOrElse中提供的任何默认功能。

当你告诉它返回Unit是,他们认为,可以这么说,“好,你说,如果它的存在,它是一个函数,如果不是它的一个单元......这意味着,所有我能发生什么事了说类型是它是一个对象。“

不管怎么说,像

val f = func getOrElse (s: String) => true 
val res = inarr.filter(f) 

会做什么,我认为你正在试图做的(这是在使用从地图检索功能的阵列inarr进行筛选)。

+0

啊!我知道了。谢啦。我以为我正在使用'Unit'来帮助自己,并推迟决定什么时候到来。一直以来,我都在脚下开枪自杀。 – delmet 2011-03-24 05:09:38

4

獭指出,Map.get类型为A => Option[B],而应用方法的类型为A => B,但是这是一个谎言,因为它可能会抛出异常。一般来说,由于这个谎言,我建议不要使用申请表。

在您的具体示例中,您可能根本不应该使用getOrElse;相反,因为你正在做的只是产生副作用,请尝试如下所示。我更改了名称'filter',因为这实际上也是Map和其他迭代器中重要方法的名称,并且重载该名称是不必要的混淆源。

class StdRead { 
    def read(key : Array[Int], value : Array[Int],seperator : Array[Char], 
     stringTests : Map[Int, String => Boolean], write : String => Unit) { 
    for { 
     ln <- stdin.getLines 
     val inarr = ln split seperator 
     i <- key 
     stringTest <- stringTests.get(i) 
    } { 
     stringTest(inarr(i)) 
    } 
    } 
} 

请注意,您可以在for的理解表达式中声明值。请记住,这些不是循环!

+0

感谢您的回复。我需要研究“理解”这个难以理解的东西。更多的绳子挂在一起。谢谢!!! – delmet 2011-03-24 05:12:10

+0

理解的好例子! – 2011-03-24 20:38:17