релевантен случай параметров функции scala? - PullRequest
4 голосов
/ 24 июня 2010

в отношении следующего скалярного кода функции m2a и m2b, очевидно, различаются только в зависимости от параметра, то есть abc против 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));
}

Ответы [ 2 ]

5 голосов
/ 24 июня 2010

При сопоставлении с образцом идентификаторы в шаблоне, начинающиеся со строчной буквы, считаются свободными переменными шаблона, которые могут быть связаны со значениями в целевом совпадении. Те, которые начинаются с заглавных букв, являются так называемыми стабильными идентификаторами и должны быть уже связаны в контексте выражения совпадения, а значение этой привязки должно быть равно подвыражению цели сопоставления в точке этого значения соответствует размещению этого стабильного идентификатора в выражении шаблона.

Кроме того, и соответствующие в данном конкретном примере переменные шаблона (имена в нижнем регистре) будут shadow любой существующей привязкой с тем же именем, которая действует в контексте выражения соответствия (включая выражение, предоставляющее целевое значение совпадения).

5 голосов
/ 24 июня 2010

Хитрость в том, как Scala обрабатывает переменные в выражениях. Переменные в нижнем регистре в выражениях case используются компилятором для введения новых переменных, которые затем сопоставляются с шаблоном. Таким образом, в методе m2b параметр метода «abc» фактически не используется. Переменная выражения case «abc» будет соответствовать любой строке, так как она не ограничена каким-либо другим способом. Таким образом, «y» успешно сопоставляется в первом случае m2b. Прописные переменные в выражениях case не вводят новые переменные, поэтому в m2a совпадение ведет себя так, как вы ожидали

Самый простой способ сопоставить значение со строчной переменной - заключить ее в кавычки. Таким образом

def m2b(n:Node, abc:String):Boolean = n match {
    case <id>{Text(`abc`)}</id> => true
    case _ => false;
  }

даст вам ожидаемые результаты.

...