2013-08-23 45 views
1

我遇到過一些我認爲是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 => 
    } 

    } 

} 

視圖類

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 = { 

    } 

    } 

查看在ItemController類的註釋。如果在註釋所在的語句和newItem setVisible true之間留有空白行,那麼代碼不會出現錯誤。

在此先感謝。

回答

5
newItem eraseForm 
newItem setVisible true 

被解析爲

newItem.eraseForm(
newItem).setVisible(true); 

,但你想擁有的是:

newItem.eraseForm; 
newItem.setVisible(true); 

離開了網點和括號意味着Scala編譯器適用 「操作符號」。這意味着你的表達總是需要是obj meth param的形式。有可能有obj meth;,但正如你所看到的,這個表單需要用分號來停止。你可以自己插入,也可以讓編譯器通過添加一個空行,一個以下面一行中的關鍵字開始的表達式,或者用大括號和圓括號來推斷它。

從2.10開始,如果你寫obj meth,你也會得到一個警告,因爲你可以看到你的問題,這樣的後綴運算符可能是有害的。

看到這兩個問題,他們對在 「操作符號」 規則的詳細信息答案: