加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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;
  }

会给你你想要的结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读