1

次の問題を回避するためにかなりの時間を探しています: 私のクラス "B" のすべてのインスタンスは、メソッドを使用して Seq "出力" をファイルに格納します。

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"
    }
}

そのため、メソッド「add」がクラス「B」のインスタンスで呼び出されるたびに、出力シーケンスがファイルに保存されます。クラス「B」のインスタンスごとに異なるファイルを作成したいと考えています。しかし、次のようなインスタンスを作成すると

val x = new B

WriteToFile-Method の this-キーワードは、「Bank()」を fileName に追加するだけです。では、クラス「B」のすべての新しいインスタンスが独自のファイルを作成するようにコードを変更するにはどうすればよいでしょうか? また、インスタンスの名前 (ここでは「x」) がファイル名を決定する文字列に追加されるように、WriteToFile-Method を変更するにはどうすればよいですか?

4

2 に答える 2

2

変数の名前に従ってオブジェクト インスタンスに名前を付けることはお勧めしません。変数は参照とは大きく異なります。たとえば、次のコードを考えてみましょう。

def foo: Object = {
    val x = new Object;
    val y = x;
    return x;
}

このメソッドは、いくつかの新しい を作成しますObject。オブジェクトへの参照は variable に割り当てられx、次に variable に割り当てられますy。これでオブジェクトは 1 つになりましたが、2 つの変数によって参照されています。メソッドが戻ったとき、オブジェクトはまだ存在していますが、おそらくそれを参照する変数があります。

したがって、オブジェクトを保持している変数でオブジェクトに名前を付けることはあまり意味がありません。そのような変数が複数ある場合もあれば、まったくない場合もあり、オブジェクトの存続期間中に変化します。

代わりに、名前を生成するための独自のメカニズムを作成することをお勧めします。1 つの可能性は、アトミック カウンターを使用することです (複数のスレッドから安全に使用できるようにするため)。

trait AtomicName {
  val name = "prefix" + AtomicName.newId;
}
object AtomicName extends App {
  import java.util.concurrent.atomic.AtomicInteger;

  private val counter = new AtomicInteger(0);

  protected def newId = counter.getAndIncrement;
}

これで、すべての拡張AtomicNameに固有の名前が付けられます。

于 2013-07-11T13:18:31.417 に答える
1
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(オブジェクトではないものを呼び出すと、空の文字列が返されます。)

これは悪い考えだと思いますが、これがその方法です。

于 2013-07-11T15:56:16.957 に答える