scala函数参数的情况是否相关?
发布时间:2020-12-16 18:19:30 所属栏目:安全 来源:网络整理
导读:关于以下 scala代码,函数m2a和m2b明显不同于参数的情况,即abc vs Abc.这似乎在结果上有所不同,如下面的例子所示.当使用最近的2.8编译器运行它时,会产生以下结果(我希望所有这些都是真的).任何见解将不胜感激. m1=truem2a=truem2b=falsem3=true 码 package sa
关于以下
scala代码,函数m2a和m2b明显不同于参数的情况,即abc vs Abc.这似乎在结果上有所不同,如下面的例子所示.当使用最近的2.8编译器运行它时,会产生以下结果(我希望所有这些都是真的).任何见解将不胜感激.
m1=true m2a=true m2b=false m3=true 码 package sample import scala.xml._ object ParamTest extends Application { def m1(n:Node,abc:String):Boolean = { n == <id>{Text(abc)}</id> } def m2a(n:Node,Abc:String):Boolean = n match { case <id>{Text(Abc)}</id> => true case _ => false; } // why does this one not work? def m2b(n:Node,abc:String):Boolean = n match { case <id>{Text(abc)}</id> => true case _ => false; } def m3(n:Node,abc:String):Boolean = n match { case Elem(_,"id",_,c @_ *) => { c contains Text(abc) } } def runner(n:Node,f:(Node,String)=>Boolean):Boolean = { f(n,"x") && !f(n,"y") && !f(n,""); } val x = <id>x</id> println("m1="+runner(x,m1)); println("m2a="+runner(x,m2a)); println("m2b="+runner(x,m2b)); println("m3="+runner(x,m3)); } 解决方法
这里的技巧是Scala如何处理case表达式中的变量.编译器采用case表达式中的小写变量来引入新变量,然后对其进行模式匹配.因此,在方法m2b中,方法参数“abc”实际上是未使用的. case表达式变量“abc”将匹配任何字符串,因为它不受其他约束.因此,在m2b的第一种情况下,“y”成功匹配. case表达式中的大写变量不会引入新变量,因此在m2a中匹配的行为与预期的一致.
匹配小写变量值的最简单方法是将其包装在反引号中.从而 def m2b(n:Node,abc:String):Boolean = n match { case <id>{Text(`abc`)}</id> => true case _ => false; } 会给你你想要的结果. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |