2014-10-13 3 views
1

У меня есть следующие установки класса:Почему я не могу получить доступ к переменной-члену объектов?

class MyClass { 
    class MyInnerClass(memberVar: String) 

    def getAInner: MyInnerClass = { 
    new MyInnerClass("hello") 
    } 
} 

Тогда у меня есть следующий код вне класса:

def myFunction = { 
    val a = new MyClass 
    val b = a.getAInner.memberVar // value memberVar is not a member of a.MyInnerClass 
} 

Почему это?

ответ

5

Вам нужно добавить ключевое слово val чтобы memberVar общественность иначе это частное значение:

class MyClass { 
    class MyInnerClass(val memberVar: String) 

    def getAInner: MyInnerClass = { 
     new MyInnerClass("hello") 
    } 
    } 
2

@ ответ Ноев совершенно правильно, но я бы также выбросить вариант использования case class. See here для некоторых сахаров, которые он предоставляет. Я использую его почти рефлексивно. В вашем примере, это будет:

object MyClass { 
    case class MyInnerClass(memberVar: String) 

    def getAInner: MyInnerClass = { 
    new MyInnerClass("hello") 
    } 
} 

def myFunction = { 
    val b = MyClass.getAInner.memberVar 
} 

Я, как правило, сделать это таким образом, потому что всегда, я хочу воспользоваться здравомыслящим по умолчанию case class предоставляет.

Я также решил использовать object для внешнего типа, потому что у него нет никаких параметров, хотя вы, возможно, просто сделали это для простоты.

+0

Можете ли вы предоставить некоторую информацию о том, что именно делает класс case? Это в основном превращает экземпляры класса в структуры? – Max

+0

@Max добавил пару ссылок. В зависимости от того, что вы подразумеваете под «структурой», я думаю, вы могли бы сказать, что это правильно. Это в основном просто автоматическое включение кучи синтаксического сахара. Я хочу 99% времени, чтобы включить идиоматическую функциональность Scala, такую ​​как сопоставление шаблонов и падение «нового» и т. Д. – acjay

+0

@acjay с классами case, у вас есть возможность вырезать ключевое слово 'new', которое менее идиоматично в контексте нормального класса. Примерами классов case являются 'Some' и' None', которые не должны быть 'new''ed. классы case предназначены для «обертывания» объектов в классах; в случае вышеприведенного примера ничего не нужно обертывать (например, с 'Some' или' Left' или 'Success', например), поэтому использование классов case в этом случае не является идиоматическим. Другой способ задуматься над этим: «Если вам не нужно сопоставлять шаблоны, не используйте класс case» –

Смежные вопросы