如何在Scala中继承相同特征的两个对象中初始化val?

学院

我认为我的问题是相关的,但与这里的问题不同

让我们定义我的第一堂课

case class NoteTaker() {
    private var note: Seq[String] = Seq("\n")
    override def toString: String = this.note.mkString("\n")

    def add(newNote: String): Unit = note ++= Seq(newNote)
}

现在我有一个特质

trait SilentLogger {
import scala.util.{ Failure, Success }
val notepad = NoteTaker()

def tryAndLog[X, Y](x: X, f: X => Y): Y = {
    notepad.add("Run with this input: " + x.toString)

    (try {
        println("Before: " + notepad.toString)
        val result = f(x)
        println("After: " + notepad.toString)
        notepad.add("Get result:-------------------------------\n" + result.toString)
        println(notepad.toString)
        Success(result)
    } catch {
        case e: Throwable => {
        println(
          "Exception occurs:" + "\n" + 
          notepad.toString + "\n" +
          e.getMessage + "\n" +
          e.getStackTrace.mkString("\n")
        )
        Failure(e)
    }}).get
}
}

我打算使用此特征与要收集一些笔记的任何类混合使用,并且仅在出现异常时才打印出笔记。否则,我可能只是将其保存到某个地方的日志文件中。

我希望记事本一次创建一次,并且可以为每个对象重复使用。实际上,我不介意它们是否共享同一个记事本。因此,我选择在特征中使用“ val”。

作为示例,我然后创建一个类

case class MyClass (myField : String) extends SilentLogger {
    def makeAnother : MyClass = tryAndLog("makeAnother",(x: String) => {
        notepad.add(x)
        val result = this.copy(myField = this.myField + " addNewField " + x)
        notepad.add(result.myField)
        return result
    })
}

最后,我尝试创建两个对象,如下所示:

scala> val firstObject = MyClass("firstObject")
firstObject: MyClass = MyClass(firstObject)

scala> val secondObject = firstObject.makeAnother
Before: 

Run with this input: makeAnother
Exception occurs:


Run with this input: makeAnother
makeAnother
firstObject addNewField makeAnother
null

secondObject: MyClass = MyClass(firstObject addNewField makeAnother)

我真的很困惑。显然发生了异常。但是创建了secondObject很好吗?但是,日志记录消息会在标准输出上打印出来,并显示错误“ null”。

我认为我的问题是我的第一个和第二个对象实际上是使用同一记事本还是分开使用?此处如何定义记事本的初始化和范围?我使用“尝试”的方式有什么问题吗?

chengpohi

这是由于匿名函数显式引起的return

   (x: String) => {
        notepad.add(x)
        val result = this.copy(myField = this.myField + " addNewField " + x)
        notepad.add(result.myField)
        return result
    }

Scala中,当return匿名函数中显式声明时,它将抛出NonLocalReturnControl,这将跳过以后的代码块执行,因为您已经捕获了Throwable,所以也将转到您的catch code block

因此,也许您可​​以return直接删除以解决此问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在子特征中初始化特征的val?

来自分类Dev

Scala从一个特性中初始化两个对象?

来自分类Dev

如何在Scala对象中模拟由函数初始化的val?

来自分类Dev

如何在构造函数的成员初始化器列表中调用两个函数?

来自分类Dev

如何在golang中干净地初始化两个相互依赖的结构?

来自分类Java

使用可运行对象的相同实例初始化两个线程

来自分类Dev

如何在Ruby中合并两个相同的对象

来自分类Java

如何在类中为两个不同的构造函数中的不同初始化的两个不同任务创建单个HashMap成员

来自分类Dev

如何使用来自两个单独的Alamofire请求的数据初始化对象?

来自分类Dev

如何用两个指针初始化类的对象?

来自分类Dev

避免在基本特征中初始化覆盖的“ val”?

来自分类Dev

如何初始化继承对象的字段

来自分类Dev

如何在继承的模型中初始化类属性

来自分类Dev

如何在Python中初始化继承的类

来自分类Dev

如何在两个嵌套的 while 循环中正确初始化/重置变量

来自分类Dev

在Swift中同时初始化两个ViewController

来自分类Dev

如何使Keras在密集层中具有两个不同的初始化器?

来自分类Dev

如何在Scala中两个不同的类扩展相同的类返回相同的类型

来自分类Dev

如何在VBA中初始化对象的属性的帮助下初始化对象

来自分类Dev

如何在打字稿中的两个对象之间键入共享相同键的两个对象?

来自分类Dev

如何在play框架的Module.scala中初始化一个DB连接

来自分类Dev

如何避免在C ++中显式构造在初始化列表中继承的所有内容?

来自分类Dev

如何在Scala中定义和初始化矩阵

来自分类Dev

使用相同的参数初始化两个Python类,获得不同的结果

来自分类Dev

如何在 Scala 中创建未初始化的 Dataframe 变量。因此可以在 if else 条件下初始化相同的变量

来自分类Dev

Scala 宏:如何获取给定包中继承某些特征的对象列表?

来自分类Dev

我如何在初始化列表中的构造函数之后初始化变量/对象?

来自分类Java

如何在Java中初始化对象的静态数组

来自分类Java

如何在Java中初始化List <String>对象?

Related 相关文章

  1. 1

    如何在子特征中初始化特征的val?

  2. 2

    Scala从一个特性中初始化两个对象?

  3. 3

    如何在Scala对象中模拟由函数初始化的val?

  4. 4

    如何在构造函数的成员初始化器列表中调用两个函数?

  5. 5

    如何在golang中干净地初始化两个相互依赖的结构?

  6. 6

    使用可运行对象的相同实例初始化两个线程

  7. 7

    如何在Ruby中合并两个相同的对象

  8. 8

    如何在类中为两个不同的构造函数中的不同初始化的两个不同任务创建单个HashMap成员

  9. 9

    如何使用来自两个单独的Alamofire请求的数据初始化对象?

  10. 10

    如何用两个指针初始化类的对象?

  11. 11

    避免在基本特征中初始化覆盖的“ val”?

  12. 12

    如何初始化继承对象的字段

  13. 13

    如何在继承的模型中初始化类属性

  14. 14

    如何在Python中初始化继承的类

  15. 15

    如何在两个嵌套的 while 循环中正确初始化/重置变量

  16. 16

    在Swift中同时初始化两个ViewController

  17. 17

    如何使Keras在密集层中具有两个不同的初始化器?

  18. 18

    如何在Scala中两个不同的类扩展相同的类返回相同的类型

  19. 19

    如何在VBA中初始化对象的属性的帮助下初始化对象

  20. 20

    如何在打字稿中的两个对象之间键入共享相同键的两个对象?

  21. 21

    如何在play框架的Module.scala中初始化一个DB连接

  22. 22

    如何避免在C ++中显式构造在初始化列表中继承的所有内容?

  23. 23

    如何在Scala中定义和初始化矩阵

  24. 24

    使用相同的参数初始化两个Python类,获得不同的结果

  25. 25

    如何在 Scala 中创建未初始化的 Dataframe 变量。因此可以在 if else 条件下初始化相同的变量

  26. 26

    Scala 宏:如何获取给定包中继承某些特征的对象列表?

  27. 27

    我如何在初始化列表中的构造函数之后初始化变量/对象?

  28. 28

    如何在Java中初始化对象的静态数组

  29. 29

    如何在Java中初始化List <String>对象?

热门标签

归档