Bagaimana anda mendefinisikan lokal var/val di primer konstruktor di Scala?

Di Scala, kelas's primer constructor tidak memiliki eksplisit tubuh, tetapi didefinisikan secara implisit dari kelas tubuh. Bagaimana, kemudian, tidak membedakan antara bidang dan nilai-nilai lokal (yaitu nilai-nilai lokal ke constructor method)?

Misalnya, mengambil potongan kode berikut, bentuk modifikasi dari beberapa contoh kode dari "Pemrograman Scala":

class R(n: Int, d: Int) {
   private val g = myfunc
   val x = n / g
   val y = d / g
}

Pemahaman saya adalah bahwa ini akan menghasilkan kelas dengan tiga bidang: pribadi "g", dan publik "x" dan "y". Namun, nilai g adalah yang digunakan hanya untuk perhitungan kolom x dan y, dan tidak memiliki makna luar konstruktor lingkup.

Jadi dalam hal ini (memang buatan) misalnya, bagaimana anda pergi tentang mendefinisikan nilai-nilai lokal untuk konstruktor ini?

Mengomentari pertanyaan (1)
Larutan

E. g.

class R(n: Int, d: Int) {
  val (x, y) = {
    val g = myfunc
    (n/g, d/g)
  }
}
Komentar (4)

Ada beberapa cara untuk melakukan itu. Anda bisa menyatakan seperti variabel sementara dalam pribadi definisi, yang akan digunakan selama waktu konstruksi. Anda dapat menggunakan variabel sementara dalam blok-blok yang kembali ekspresi (seperti di Alaz's jawaban). Atau, akhirnya, anda dapat menggunakan variabel tersebut dalam alternatif konstruktor.

Dalam cara yang mirip dengan alternatif konstruktor, anda juga bisa menentukan mereka dalam obyek-pendamping's "menerapkan" metode.

Apa yang anda can't lakukan adalah mendeklarasikan sebuah field untuk menjadi "sementara".

Perhatikan juga bahwa setiap parameter yang diterima oleh primer konstruktor adalah bidang juga. Jika anda don't ingin seperti parameter-parameter yang menjadi bidang, dan don't ingin mengekspos aktual bidang dalam constructor, solusi yang biasa adalah untuk membuat primer konstruktor pribadi, dengan aktual bidang, dan gunakan salah satu alternatif konstruktor atau benda-pendamping's berlaku() sebagai efektif "dasar" konstruktor.

Komentar (0)

Pilihan lain yang kita miliki adalah untuk membuat objek utama konstruktor pribadi dan menggunakan pendamping objek's menerapkan metode sebagai pembangun. Jika kita menerapkan (pun tidak dimaksudkan) pendekatan ini untuk contoh anda itu akan terlihat seperti ini:

class R private (val x: Int, val y: Int);

object R {
  def apply(n: Int, d: Int): R = {
    val g = myfunc;
    new R(n / g, d / g);
  }
}

Untuk membuat R instance dari:

val r = new R(1, 2);

menulis:

val r = R(1, 2);

Ini adalah sedikit bicara, tetapi bisa menjadi lebih buruk, saya pikir :). Let's berharap bahwa pribadi[ini] vals akan diperlakukan sebagai variabel sementara dalam rilis mendatang dari Scala. Martin sendiri mengisyaratkan bahwa.

Komentar (2)

Beberapa diskusi tentang topik ini, termasuk Martin Odersky's komentar, adalah di sini

Komentar (2)