簡體   English   中英

在引用 scala 方法的 intellij 中出現錯誤我實際上並沒有在我使用過的 class 中使用

[英]Getting an error in intellij referencing a scala method I'm not actually using in a class I have used

我正在玩耍並學習一些 scala 並且遇到了一個我不理解且找不到解決方法的奇怪錯誤。

這是我要運行的代碼:

object Classes {
def main(args: Array[String]): Unit = {

    val rover = new Animal()
    rover.setName("Rover")
    rover.setSound("Woof")
    printf("%s says %s\n", rover.getName(), rover.getSound())

    val cat = new Animal("Tiddles", "Meow")
    println(s"${cat.getName()} with ID ${cat.id} says ${cat.getSound()}")

    println(cat.toString())

    val onions = new Dog("Onions", "Woof", "Grrrrrr....")
    onions.setName("Onions")
    println(onions.toString())

    val fang = new Wolf("Fang")
    fang.moveSpeed = 41.56387
    println(fang.move)
}

class Animal (var name: String, var sound: String) {

    this.setName(name)

    val id: Int = Animal.newIdNum

    def getName : String = name
    def getSound: String = sound

    def setName(name : String): Unit = {
        if (!(name.matches(".*\\d+.*")))
            this.name = name
        else
            this.name = "No Name"
    }

    def setSound(sound: String): Unit = {
        this.sound = sound
    }

    def this(name: String) {
        this("No Name", "No Sound")
        this.setName(name)
    }

    def this() {
        this("No Name", "No Name")
    }

    override def toString: String = {
        return "%s with ID %d says %s".format(this.name, this.id, this.sound)
    }
}

object Animal {
    private var idNumber = 0
    private def newIdNum = {
        idNumber += 1;
        idNumber
    }
}

class Dog(name: String, sound: String, growl: String) extends Animal(name, sound) {

    def this(name: String, sound: String) {
        this("No Name", sound, "No Growl")
        this.setName(name)
    }

    def this(name: String) {
        this("No Name", "No Sound", "No Growl")
        this.setName(name)
    }

    def this() {
        this("No Name", "No Sound", "No Growl")
    }

    override def toString: String = {
        return "%s with ID %d says %s or %s\n".format(this.name, this.id, this.sound, this.growl)
    }
}

abstract class Mammal(val name: String) {
    // Just declare variables and only define method signatures
    var moveSpeed : Double
    def move : String
}

class Wolf(name: String) extends Mammal(name) {
    override var moveSpeed: Double = 35.0
    override def move: String = "%s runs at %.2f mph\n".format(this.name, this.moveSpeed)
}

}

這是我得到的錯誤:

Error:(7, 37) not enough arguments for method apply: (index: Int)Char in class StringOps.
Unspecified value parameter index.
printf("%s says %s", rover.getName(), rover.getSound())

Error:(7, 55) not enough arguments for method apply: (index: Int)Char in class StringOps.
Unspecified value parameter index.
printf("%s says %s", rover.getName(), rover.getSound())

Error:(10, 26) not enough arguments for method apply: (index: Int)Char in class StringOps.
Unspecified value parameter index.
println(s"${cat.getName()} with ID ${cat.id} says ${cat.getSound()}")

Error:(10, 67) not enough arguments for method apply: (index: Int)Char in class StringOps.
Unspecified value parameter index.
println(s"${cat.getName()} with ID ${cat.id} says ${cat.getSound()}")

我沒有使用 class StringOps 中的 apply 方法,所以我不知道為什么它抱怨我沒有指定參數; 指數。

不用說,如果我注釋掉錯誤中提到的 2 行,它就會運行。

關於編譯器為什么要尋找這種 apply 方法的任何建議。

最好使用配套的 object 來創建像這樣的 class 的不同變體。 (我省略了idtoString邏輯,因為這基本上沒問題)。

class Animal protected (initalName: String, initialSound: String) {
  private def checkedName(name: String): String =
    if (name.matches(".*\\d+.*")) {
      "No Name"
    } else {
      name
    }

  protected var _name = checkedName(initalName)
  def name: String = _name
  def setName(name: String): Unit =
    _name = checkedName(name)

  var sound = initialSound
}

object Animal {
  def apply(name: String, sound: String): Animal = new Animal(name, sound)
  def apply(name: String): Animal = new Animal(name, "No Sound")
  def apply(): Animal = new Animal("NoName", "No Sound")
}

class Dog protected (name: String, sound: String, val growl: String) extends Animal(name, sound)

object Dog {
  def apply(name: String, sound: String, growl: String): Dog = new Dog(name, sound, growl)
  def apply(name: String, sound: String): Dog = new Dog(name, sound, "No Growl")
  def apply(name: String): Dog = new Dog(name, "No Sound", "No Growl")
  def apply(): Dog = new Dog("No Name", "No Sound", "No Growl")
}

通常也會從訪問器方法中刪除get ,以便它們看起來像 object 屬性。

另請注意,Scala 用於函數式編程,因此通常使這種 class 不可變。 這意味着setName方法將成為withName方法,並將返回 class 的新(不可變)實例。 這種方法一開始感覺比較笨拙,但隨着邏輯變得越來越復雜,它會獲得好處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM