Scala 如何使用此关键字将实例名称添加到字符串中?

Scala 如何使用此关键字将实例名称添加到字符串中?,scala,Scala,我正在寻找一段时间来解决以下问题: 我的类“B”的每个实例都使用一个方法在文件中存储一个Seq“output” class B extends IO { private var b = 0.0 var output = Seq(0.0) def add(a:Int) = { b += a output :+= b WriteToFile(fileName, output) } } WriteToFile方法还有一

我正在寻找一段时间来解决以下问题: 我的类“B”的每个实例都使用一个方法在文件中存储一个Seq“output”

class B extends IO {
    private var b = 0.0
    var output = Seq(0.0)

    def add(a:Int) = {
        b += a
        output :+= b
        WriteToFile(fileName, output)
    }
}
WriteToFile方法还有一个特点:

trait IO {
    def WriteToFile(fileName:String, data:Seq[Int]) = {
        create file and name it something like: fileName+this+".m"
    }
}
因此,每次对类“B”上的实例调用方法“add”时,输出序列都存储在一个文件中。我想为类“B”的每个实例创建一个不同的文件。但是当我创建一个类似

val x = new B

WriteToFile方法中的this关键字只是将“Bank()”添加到文件名中。那么,如何改变代码,使类“B”的每个新实例都创建自己的文件呢?如何更改WriteToFile方法,使实例名称(此处为“x”)添加到确定文件名的字符串中?

我不鼓励您尝试根据变量名称命名对象实例。它们与我们有很大的不同。例如,让我们看一段代码:

def foo: Object = {
    val x = new Object;
    val y = x;
    return x;
}
此方法创建一些新的
对象
。对对象的引用分配给变量
x
,然后分配给变量
y
。现在我们有一个对象,但被两个变量引用。当方法返回时,对象仍然存在,但可能有引用它的变量

因此,用保存对象的变量来命名对象并不是很有意义——可以有多个这样的变量,也可以没有,并且在对象的生命周期中会发生变化

相反,我建议您创建自己的名称生成机制。一种可能性是使用原子计数器(以便可以从多个线程安全使用):

现在,扩展原子名的所有内容都将具有唯一的名称

trait IO {
  def myName = 
    this.getClass.getName.split("\\$",-1).dropRight(1).lastOption.getOrElse("")
}

class B extends IO {
  var output = Seq(0.0)
}

object x extends B {
  def test { println(myName + " has " + output) }
}
请注意,您必须使用
object x
而不是
val x
,这确实包含一些开销,而且它是惰性的--
x
是在第一次使用它的内容时创建的,而不是在第一次声明它时创建的。(如果对非对象的对象调用
myName
,它将为您提供一个空字符串。)


我认为这是一个坏主意,但这是如何做到的。

对象(类的实例)没有名称。所以没有“实例名”这样的东西。变量有名称,但变量是对对象的引用,可以有多个变量引用同一对象。所以,您想要的是不可能的-您对变量和对象的名称有误解。只有在类中定义实例名称时,才能添加实例名称。我添加Bank()可能是因为您的类型Bank是一个case类,它为您定义了toString。通常new Object().toString会打印jvm-hashcode,这几乎没有什么用处。谢谢您的评论。我想,现在我有了这个概念。这很有帮助。尤其是你的,维塔利!谢谢你的回答,这就是我要找的!
trait IO {
  def myName = 
    this.getClass.getName.split("\\$",-1).dropRight(1).lastOption.getOrElse("")
}

class B extends IO {
  var output = Seq(0.0)
}

object x extends B {
  def test { println(myName + " has " + output) }
}