当前位置: 首页 > 知识库问答 >
问题:

与mixins一起使用模式匹配时的怪异行为

东郭阳德
2023-03-14
object T {
  def method: Unit = {
    trait Mixin
    case class Foo(foo: String)

    val f = new Foo("hi") with Mixin
    f match {
      case Foo(s) => println(s)
    }
  }
}

当我调用test.method时,它编译并打印“hi”。模式匹配代码甚至可以在嵌套方法或嵌套函数中,并且可以工作。但是,如果我将case类移到方法之外并直接附加到t2:

object T2 {

  case class Foo(foo: String)

  def method: Unit = {
    trait Mixin

    val f = new Foo("hi") with Mixin
    f match {
      case Foo(s) => println(s)
    }
  }
}

它将引发以下错误:

Error:(183, 12) constructor cannot be instantiated to expected type;
 found   : T2.Foo
 required: T2.Foo with Mixin
      case Foo(s) => println(s)
           ^

如果现在我不使用Mixin,而只使用val f=new Foo(“hi”),它又能正常工作了。如果我试图匹配它的类型,它也可以工作:

val f = new Foo("hi") with Mixin
f match {
  case f: Foo => println("I am a Foo")
}

共有1个答案

宗政才俊
2023-03-14

我相信有几件事正在发生。

  • Scala编译器正在尝试找出匹配的类型。
  • 您将顶级类型与本地类型混合在一起,这似乎会使编译器感到困惑。

t中,foomixin都在方法的作用域中本地声明。本地类型不需要在其作用域之外可用(在本例中是method)。因为一切都在同一个范围内,所以编译器很容易弄清楚您要做什么。

object T2 {
  case class Foo(foo: String)
  def method: Unit = {
    trait Mixin
    val f: Foo = new Foo("hi") with Mixin
    f match {
      case Foo(s) => println(s)
    }
  }
}
 类似资料:
  • 我在为Spring Cloud Config服务器定义多个基于svn的配置存储库时遇到了问题。我已经建立了三个配置库。一个用于开发,单位和生产。我已经将默认值设置为development(通过设置spring.cloud.config.server.svn.uri=development repo uri)。但是,每当我向配置服务器的RESTendpoint发出GET请求时,无论我请求哪个概要文件

  • 问题内容: 如何找到具有匹配模式的所有键的计数。 例如,有两个键和。常见的模式是。因此,这里的计数是2。 如何在Redis中做到这一点? 问题答案: 免责声明 我希望这个旧答案不会损坏任何具有数百万把钥匙的生产系统。如果出于某种原因仍要在生产中仍然计算redis的匹配键,最好使用具有匹配模式的scan。 如果仅使用KEYS进行搜索,并使用Redis客户端,您将获得所有匹配密钥的数字列表,对吗? 例

  • 我在angular 5中实现了一个模式,在.ts文件中使用以下代码进行密码验证。这样做的目的是支持至少八个字符,至少一个大写字母、一个小写字母、一位数字和一个特殊字符。请参阅:密码的Regex必须包含至少八个字符、至少一个数字以及大小写字母和特殊字符 我明白了,当我在密码文本框中输入一个字符串时,例如< code>Niladri1!然而,当我输入一个类似于< code>Nopasss123!!,它

  • 我已经实现了使用regex从字符串中提取一些值的逻辑,如下所示。 它按预期工作。我现在必须使用java流实现此逻辑,以使其更具可读性。我只是想让它更具可读性,更容易看到。我已经实现了使用这个,但它没有工作任何建议。 我得到的错误是没有找到匹配。但是有没有办法给下一个流提供matcher呢

  • 我有一个字符串,我正试图根据几个regex模式验证它,我希望由于模式匹配在3.10中可用,我可以使用它来代替创建if-else块。 考虑一个字符串'validateString',其可能的值1021102,1.25.32string021。 我尝试的代码如下所示。 对于正则表达式1、2和3,我尝试了字符串正则表达式模式,还重新设置了。编译对象,但它似乎不起作用。 我一直试图在互联网上找到这方面的例