Я играю и изучаю немного скала и столкнулся со странной ошибкой, которую я не понимаю и не могу найти способ исправить.
Вот код, который я пытаюсьвыполнить:
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()}")
Я не использовал метод apply из класса StringOps, поэтому у меня нетидея, почему это жалуется, что я не указал параметр;index.
Само собой разумеется, если я закомментирую 2 строки, упомянутые в ошибках, он запустится.
Любые предложения по поводу того, почему компилятор ищет этот метод применения.