Scala语法错误?

vic*_*aba 1 syntax scala

我在scala语法中遇到了一些我认为是bug/no-syntax-sense的东西,但我更喜欢在报告之后将其发布在此处,因为我可能错了.

控制器类:

package some

import java.awt.event.ActionListener
import java.awt.event.ActionEvent

class ItemController extends ActionListener {

  val NEW_ITEM = "new item"
  val UPDATE_ITEM = "update item"

  private val newItem = new ItemNew

  override def actionPerformed(e: ActionEvent) = {

  }

  def create(view: String) = {

    view match {
      case NEW_ITEM => {
        newItem eraseForm //Here eclipse says "Unit does not take parameters".
        newItem setVisible true
      }

      case UPDATE_ITEM =>
    }

  }

}
Run Code Online (Sandbox Code Playgroud)

视图类

  package some

  import scala.collection.mutable.HashMap
  import javax.swing.JPanel
  import java.awt.GridLayout
  import javax.swing.JFrame
  import scala.collection.mutable.LinkedHashMap
  import javax.swing.JTextField
  import java.awt.BorderLayout
  import java.awt.FlowLayout
  import javax.swing.JLabel

  class ItemNew extends JFrame {

    private val formFields = LinkedHashMap[String, JTextField]()

    init

    private def init(): Unit = {
      // defining form fields
      formFields += ("name" -> new JTextField(20),
        "surname" -> new JTextField(20),
        "age" -> new JTextField(3))

      setLayout(new BorderLayout)

      val formPanel = new JPanel
      formPanel setLayout (new GridLayout(formFields.size, 1))

      generateForm(formPanel)
      getContentPane add formPanel

      pack
      setVisible(true)

      def generateForm(formPanel: JPanel) = {

        var leftPanel: JPanel = null
        var rightPanel: JPanel = null
        var gridPanel: JPanel = null

        formFields foreach (entry => {

          leftPanel = new JPanel(new FlowLayout)
          leftPanel.getLayout().asInstanceOf[FlowLayout] setAlignment FlowLayout.LEFT

          rightPanel = new JPanel(new FlowLayout)
          rightPanel.getLayout.asInstanceOf[FlowLayout] setAlignment FlowLayout.LEFT

          gridPanel = new JPanel(new GridLayout(1, 2))

          leftPanel add new JLabel(entry._1 + ':')
          rightPanel add entry._2

          gridPanel add leftPanel
          gridPanel add rightPanel

          formPanel add gridPanel

        })
      }
    }

    def getFormContent: HashMap[String, String] = {

      val formData = HashMap[String, String]()

      formFields foreach (entry => {
        formData += (entry._1 -> entry._2.getText)
      })

      return formData
    }

    def eraseForm : Unit = {
      formFields foreach (entry => {
        entry._2 setText ""
      })
    }

    private def addListeners = {

    }

  }
Run Code Online (Sandbox Code Playgroud)

请参阅ItemController类中的注释.如果我在注释所在的语句之间留下一个空行,newItem setVisible true那么代码就没有错误.

提前致谢.

kir*_*uku 5

newItem eraseForm
newItem setVisible true
Run Code Online (Sandbox Code Playgroud)

被解析为

newItem.eraseForm(
newItem).setVisible(true);
Run Code Online (Sandbox Code Playgroud)

但你想拥有的是:

newItem.eraseForm;
newItem.setVisible(true);
Run Code Online (Sandbox Code Playgroud)

省略点和括号意味着Scala编译器应用"运算符表示法".这意味着您的表达式始终需要是表单obj meth param.有可能obj meth;但是你可以看到这个表单需要用分号来停止.您可以自己插入它,也可以让编译器通过添加一个空行,一个以下一行中的关键字开头的表达式或者使用右括号和圆括号来推断它.

从2.10开始,如果你写的话你也会收到警告,obj meth因为这样的后缀操作符可能对你的问题有所帮助.

有关"操作符号"规则的更多信息,请参阅这两个问题及其答案: