Correspondência de padrões um String como Seq [Char]

votos
10

Em Scala é possível formular padrões com base nos caracteres invididual de uma string tratando-o como um Seq [Char].

Um exemplo desse recurso é mencionado em uma excursão de Scala

Este é o código de exemplo usado lá:

object RegExpTest1 extends Application {
 def containsScala(x: String): Boolean = {
   val z: Seq[Char] = x
   z match {
      case Seq('s','c','a','l','a', rest @ _*) =>
                println(rest is +rest)
                true
      case Seq(_*) =>
                false
   }
 }

}

O problema que tenho com esta é a terceira linha do trecho:

val z: Seq[Char] = x

Porque é que este tipo de elenco necessário? Uma cadeia não deve se comportar como um Seq [Char] em todas as circunstâncias (que incluem correspondência de padrões)? No entanto, sem essa conversão, o trecho de código não vai funcionar.

Publicado 11/04/2009 em 19:15
fonte usuário
Em outras línguas...                            


3 respostas

votos
11

Não 100% de certeza se isso é correto, mas minha intuição diz que, sem essa conversão explícita faria jogo padrão contra java.lang.String, que não é o que você quer.

A conversão explícita força o compilador Scala usar Predef.stringWrapperconversão implícita; Assim, como RichString estende Seq[Char], você é capaz de fazer uma correspondência de padrão, como se a corda eram uma sequência de caracteres.

Respondeu 11/04/2009 em 19:25
fonte usuário

votos
7

Vou repetir tudo o que andri disse. Para interoperabilidade, cordas Scala são java.lang.Strings. Em Predef, há uma conversão implícita de Stringque RichString, que implementa Seq[Char].

Uma maneira talvez mais agradável de codificar o jogo padrão, sem precisar de um val intermediário zpara segurar a Seq[Char]:

def containsScala(x: String): Boolean = {
  (x: Seq[Char]) match {
    ...
  }
}
Respondeu 11/04/2009 em 22:05
fonte usuário

votos
17

Há algum abuso real da terminologia acontecendo na questão e os comentários. Não há elenco neste código e, especialmente, "Então, basicamente, esta é uma grande concessão para a interoperabilidade Java, sacrificando algum tipo solidez" não tem base na realidade.

Um elenco scala parece com isso: x.asInstanceOf[Y].
O que você vê acima é uma atribuição:val z: Seq[Char] = x

Esta atribuição é legal porque não há uma conversão implícita de Stringque Seq[Char]. Eu enfatizo novamente, este não é um elenco . Um elenco é uma afirmação arbitrária que pode falhar em tempo de execução. Não há caminho para a conversão implícita a falhar.

O problema com dependendo conversões implícitas entre tipos, ea resposta para a pergunta original, é que as conversões implícitas só pode ter lugar se o valor original não digite cheque. Uma vez que é perfeitamente legal para combinar em uma corda, nenhuma conversão ocorre, o jogo apenas falha.

Respondeu 12/04/2009 em 01:01
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more