使用默认值初始化时的未绑定占位符参数

qed*_*qed 5 scala

这是代码:

package scalafx.ensemble.example.charts

import javafx.scene.chart.PieChart.Data

import scala.util.Random
import scalafx.application.JFXApp
import scalafx.scene.Scene
import scalafx.Includes._
import scalafx.collections.ObservableBuffer
import scalafx.scene.chart.PieChart
import scalafx.scene.input.MouseEvent

object BasicPie extends JFXApp {
  // data level 1
  val pieChartDataBuffer: ObservableBuffer[Data] = ObservableBuffer(
    PieChart.Data("A", 20),
    PieChart.Data("B", 30),
    PieChart.Data("C", 10),
    PieChart.Data("D", 40)
  )

  pieChartDataBuffer.foreach(
    (data: Data) => data.node().onMouseClicked = {
      (_: MouseEvent) => pieChart.data = pieChartDataSubBuffer(data.name())
    }
  )

  val pieChart = new PieChart {
    data = pieChartDataBuffer
    title = "DrillDown Pie Chart"
  }

  // data level 2
  val pieChartDataSubBuffer: Map[String, ObservableBuffer[Data]] = _
  Array("A", "B", "C", "D").foreach(
    (letter: String) => {
      val subData: ObservableBuffer[Data] = _
      (1 to 10).foreach(
        i => {
          val subName = letter + "-" + i
          subData.add(PieChart.Data(subName, Random.nextInt(100)))
        }
      )
      pieChartDataSubBuffer.updated(letter, subData)
    }
  )

  pieChartDataSubBuffer.foreach(
    (nameDataBufferTuple) => {
      nameDataBufferTuple._2.foreach(
        (data: Data) => {
          data.node().onMouseClicked = {
            (_: MouseEvent) => pieChart.data = pieChartDataBuffer
          }
        }
      )
    }
  )

  // set listener for one data node
  def drillDownData = (pieData: Data, pie: PieChart) => {
    pieData.node().onMouseClicked = (_: MouseEvent) => pie.data = pieChartDataSubBuffer(pieData.name())
  }

  stage = new JFXApp.PrimaryStage {
    title = "Drilldown Pie Chart Example"
    scene = new Scene {
      root = pieChart
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

人们期望subData用它初始化null,但不是我得到错误:Unbound placeholder parameter.为什么?

Sas*_*erg 9

你不能创建一个未初始化的val,因为你以后永远不能分配任何有用的东西.

假设您明确说明:

val subData: ObservableBuffer[Data] = null

subData = ObservableBuffer.empty -> error: reassignment to val!
subData.add(data) -> NullPointerException
Run Code Online (Sandbox Code Playgroud)

你要么把它初始化为 var

var subData: ObservableBuffer[Data] = _
Run Code Online (Sandbox Code Playgroud)

或者(特别是在可变集合的情况下)作为空缓冲区

val subData: ObservableBuffer[Data] = ObservableBuffer.empty // comes to mind
Run Code Online (Sandbox Code Playgroud)

你的代码会建议你想要做后者.