![](/img/trans.png)
[英]I'm using Intellij IDEA. How do I “view source” for xerces stacktrace that is used by scala.xml?
[英]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 的不同變體。 (我省略了id
和toString
邏輯,因為這基本上沒問題)。
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.