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,数据))
皮查特
}
}
}
}