2015-03-13 4 views
5

Иногда можно было бы объявить x тем же самым типом, что и y. С vals тип вывода обрабатывает это очень хорошо, но это не работает в некоторых других областях, например with function types.Почему у Scala нет указателя?

Решение, которое кажется очевидным для программиста с опытом C++, будет decltype. В нынешней Скале такого объекта нет.

Ответ на вопросы, связанные говорит:

, потому что типы не являются гражданами первого класса

Я должен признать, что я не понимаю этого. Я не думаю, что типы являются гражданами первого класса на C++, но все же он может иметь decltype. Я не спрашиваю ни о чем, как decltype для параметров типа в дженериках или что-то в этом роде (я понимаю, что дженерики не являются шаблонами и типы стираются в них). Тем не менее, я думаю, что оператор, который позволил бы мне использовать тип выражения в месте, где ожидается тип, - конечно, компилятор должен иметь возможность оценивать тип выражения, иначе определение типа для определения val было бы невозможным.

decltype может быть использован, как показано ниже - код не пытается сделать что-нибудь что-нибудь полезное, только чтобы показать синтаксис и основные способы использования:

case class A(x:Int = 0) 

val a = new A(10) 
val b = new decltype(a) 

def f(c:decltype(a)) : decltype(a.x+a.x) 

является отсутствие decltype осознанное решение, или есть некоторые конкретные причины, по которым Scala не может это иметь? Возможно ли какое-то решение, использующее отражение времени компиляции, которое позволит это?

+0

Как 'b' вступают в игру здесь ? –

+0

@ m-z b здесь, как пример. В этом конкретном случае это будет то же самое, что и val b = a, но легко представить себе аналогичный случай, когда он не будет одинаковым. Я попытаюсь обновить вопрос. – Suma

+0

Я не понимаю вопроса. Типичные подписи - это время компиляции, поэтому вы должны иметь возможность указать тип статически. Тогда что дает вам эта «декларация»? Каков «недостаток» регулярных «val b: A = a» и «def f (c: A): A'? –

ответ

1

Мой первый удар:

class Decl[T] { type Type = T } 
object Decl { def apply[T](x: T) = new Decl[T] } 

Например, если у нас есть какая-то переменная x тип которого мы не хотим, чтобы прямо заявить:

val d = Decl(x) 
type TypeOfX = d.Type 
+0

Это действительно приятно. Жаль, что нельзя писать 'Decl (x) .Type' напрямую (или, по крайней мере, я не нашел способа), но все же приятно, что он выполняет эту работу. – Suma

+0

Я думаю, что это показывает отсутствие чего-то типа 'decltype' в Scala, скорее всего, намеренное решение. – Suma

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