Scala:在将构造函数参数发送到 super 之前如何使用它们?

发布于 2024-12-11 14:19:34 字数 432 浏览 0 评论 0原文

我正在学习斯卡拉。我想实现一个 Exception 的子类,它获取一个名称作为参数,并构建一条嵌入该名称的消息。与此类似:

class InvalidItem(itemName: String) extends Exception(msg: name) {
  def this(itemName)= {
    super("Invalid item: " + itemName)
  }
}

在这种情况下,我只想在将 itemName 传递给超级构造函数之前添加 "Invalid item:" 。但我找不到路。

我尝试过几种类似的语法(即用 this 替换 super),但不断出现神秘错误。

在 Scala 中执行此操作的正确方法是什么?

I'm learning Scala. I want to implement a subclass of Exception that gets a name as parameter and builds a message with that name embedded on it. Something similar to this:

class InvalidItem(itemName: String) extends Exception(msg: name) {
  def this(itemName)= {
    super("Invalid item: " + itemName)
  }
}

In this case, I simply want to prepend itemName with "Invalid item:" before passing it to the superconstructor. But I can't find the way.

I've tried several similar syntaxes (i.e. replacing super by this) but kept getting cryptic errors.

What is the correct way of doing this in Scala?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

回眸一遍 2024-12-18 14:19:34

您实际上是在 extends 子句中调用父构造函数,因此以下内容有效:

class InvalidItem(itemName: String) extends Exception("Invalid item name" + itemName)

有关此语法及其动机的讨论,请参阅示例 此博文,作者:Daniel Spiewak:

extends 子句中的一点额外语法就是您如何
调用超类构造函数...这可能看起来有点奇怪
乍一看,但实际上提供了一种很好的语法方法来确保
对超级构造函数的调用始终是第一个语句
在构造函数中。在 Java 中,这当然是经过编译检查的,但是
语法中没有任何直观明显的东西可以阻止您
从调用更底层的超级构造函数
执行。在 Scala 中,调用超级构造函数并调用
超类方法实现是完全不同的操作,
从句法上来说。这会带来更直观的理解流程
为什么一个可以任意调用而另一个必须先调用
到其他任何事情。

You're actually calling the parent constructor in the extends clause, so the following works:

class InvalidItem(itemName: String) extends Exception("Invalid item name" + itemName)

For a discussion of this syntax and its motivation, see for example this blog post by Daniel Spiewak:

That little bit of extra syntax in the extends clause is how you
call to a superclass constructor... This may seem just a bit odd at
first glance, but actually provides a nice syntactical way to ensure
that the call to the super constructor is always the first statement
in the constructor. In Java, this is of course compile-checked, but
there’s nothing intuitively obvious in the syntax preventing you
from calling to the super constructor farther down in the
implementation. In Scala, calling the super constructor and calling a
superclass method implementation are totally different operations,
syntactically. This leads to a more intuitive flow in understanding
why one can be invoked arbitrarily and the other must be called prior
to anything else.

極樂鬼 2024-12-18 14:19:34
class InvalidItem private(val name: String) extends Exception(name)

object InvalidItem{
  def apply(name: String) = new InvalidItem("Invalid item: " + name)
}

object Text extends App{
    val item = InvalidItem("asd")
    println(item.name)
    //Invalid item: asd
}
class InvalidItem private(val name: String) extends Exception(name)

object InvalidItem{
  def apply(name: String) = new InvalidItem("Invalid item: " + name)
}

object Text extends App{
    val item = InvalidItem("asd")
    println(item.name)
    //Invalid item: asd
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文