Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用默认值初始化时的未绑定占位符参数_Scala - Fatal编程技术网

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

Scala 使用默认值初始化时的未绑定占位符参数,scala,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

代码如下:

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

}

人们期望
子数据
被初始化为
null
,但我得到的不是这个,而是一个错误:
未绑定占位符参数
。为什么?

您不能创建未初始化的
val
,因为以后您永远无法为其分配任何有用的内容

如果你说得很清楚:

val subData: ObservableBuffer[Data] = null

subData = ObservableBuffer.empty -> error: reassignment to val!
subData.add(data) -> NullPointerException
您可以将其初始化为
var

var subData: ObservableBuffer[Data] = _
或者(特别是在可变集合的情况下)作为空缓冲区

val subData: ObservableBuffer[Data] = ObservableBuffer.empty // comes to mind

您的代码会建议您执行后一种操作。

为了记录,下面是编译的修改版本:

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
import scala.collection.mutable.{HashMap => MMap}

object BasicPie extends JFXApp {

  stage = new JFXApp.PrimaryStage {
    title = "Drilldown Pie Chart Example"
    scene = new Scene {
      root = {
        val pieChartDataBuffer = ObservableBuffer(
          PieChart.Data("A", 20),
          PieChart.Data("B", 30),
          PieChart.Data("C", 10),
          PieChart.Data("D", 40)
        )
        val pieChart = new PieChart {
          data = pieChartDataBuffer
          title = "DrillDown Pie Chart"
        }

        def subPieChartData: MMap[String, ObservableBuffer[Data]] = {
          val subDataMap: MMap[String, ObservableBuffer[Data]] = MMap.empty
          for(letter <- Array("A", "B", "C", "D")) {
            val dataBuffer: ObservableBuffer[Data] = ObservableBuffer.empty
            for(i <- 1 to 10)  {
              val subLabel = letter + i
              dataBuffer.add(PieChart.Data(subLabel, Random.nextInt(100)))
            }
            subDataMap.update(letter, dataBuffer)
          }
          subDataMap
        }

        def drillDownData = (pie: PieChart, pieData: PieChart.Data) => {
          val labelPrefix = pieData.name()
          val subData = subPieChartData(pieData.name())
          pieData.node().onMouseClicked = (_: MouseEvent) => pie.data = subData
          subData.foreach(
            (data) => climbUpData(pie, data)
          )
        }

        def climbUpData = (pie: PieChart, pieData: PieChart.Data) => {
          val node = pieData.node()
          if(node != null) {
            node.onMouseClicked = (_: MouseEvent) => pie.data = pieChartDataBuffer
          }
        }

        pieChartDataBuffer.foreach((data: Data) => drillDownData(pieChart, data))

        pieChart
      }
    }
  }

}
包scalafx.ensemble.example.charts
导入javafx.scene.chart.PieChart.Data
导入scala.util.Random
导入scalafx.application.JFXApp
导入scalafx.scene.scene
导入scalafx.Includes_
导入scalafx.collections.ObservableBuffer
导入scalafx.scene.chart.PieChart
导入scalafx.scene.input.MouseEvent
导入scala.collection.mutable.{HashMap=>MMap}
对象BasicPie扩展了JFXApp{
stage=新的JFXApp.PrimaryStage{
title=“向下展开饼图示例”
场景=新场景{
根={
val pieChartDataBuffer=可观察的Buffer(
PieChart.数据(“A”,20),
图表数据(“B”,30),
图表数据(“C”,10),
图表数据(“D”,40)
)
val pieChart=新pieChart{
数据=pieChartDataBuffer
title=“向下展开饼图”
}
def子页面hartData:MMap[字符串,ObservableBuffer[数据]]={
val子数据映射:MMap[字符串,ObservableBuffer[数据]]=MMap.empty
for(字母pie.data=子数据)
subData.foreach(
(数据)=>a(饼图,数据)
)
}
def UPDATA=(饼图:饼图,饼图数据:饼图.数据)=>{
val node=pieData.node()
如果(节点!=null){
node.onmouseClicated=(uuz:MouseEvent)=>pie.data=pieChartDataBuffer
}
}
foreach((数据:数据)=>drillDownData(pieChart,数据))
皮查特
}
}
}
}