когда мне нужно добавить определения членов в мой класс в Scala? - PullRequest
0 голосов
/ 20 апреля 2019

Я вроде как новичок в scala, и я придумал этот код, когда пытался узнать синтаксис совпадений, первый код - это то, что я сделал с его ошибкой, а второй - как я ее исправил. Кто-нибудь знает, почему мне нужно добавить член "имя" в мой класс?

trait T
class A (name: String) extends T
case class B (cls: A)
object Main {
    def main(args: Array[String]) {
        val a: A = new A("John")
        val b: B = new B(a)
        checkType(b)
    }

    def checkType(cls: AnyRef) {
        cls match {

            case B(input) => println("your name is " + input.name)
            case _ => println("others")
        }
    }
}

приведенный выше код выдает мне ошибку: «имя значения не является членом A» Теперь, если я изменю класс А на этот:

class A (n: String) extends T
{
   var name: String = n
}

вывод будет "ваше имя Джон" (что я и ожидал)

P.S: если я изменю класс А на класс дел, проблема решается, почему?

1 Ответ

0 голосов
/ 20 апреля 2019
class A (name: String) extends T

параметры без val или var относятся к типу private [this] и видны только внутри класса

если вы измените его на

class A (val name: String) extends T

это делает параметр конструктора name общедоступным и может быть доступно для объектов класса без необходимости использования метода получения (используйте var, если вы хотите изменить значения)

и если это это

case class A (name: String) extends T

параметры класса case являются общедоступными val по умолчанию, поэтому он работает так, как вы сказали

справочно https://docs.scala -lang.org / тур / classes.html
https://docs.scala -lang.org / тур / случай-classes.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...