2013-07-16 3 views
1

Может ли кто-нибудь рассказать о признаке «неизменного» в scala? На первый взгляд я думал, что это будет хорошая структура управления, чтобы ограничить класс, который я создаю, но, как ни странно, я заметил, что примитивные типы не распространяют это. Для этого есть причина? Есть ли способ привязать синтаксис к Immutable или AnyVal?Примитивные типы не претерпевают Неизменяемость в scala?

class Test { 

    def test[T<:Immutable](x:T)={ 
    println("passes "+x) 

} 
    case class X(s:String) extends Immutable 

    test(X("hello")) //passes 
    // test("fail") - does not pass compiler 

} 
+1

'java.lang.String' не является примитивным типом; поскольку он определен Java, Scala может работать только вокруг него, чтобы обеспечить функциональность. См. Http: // www.scala-lang.org/api/current/index.html#scala.collection.immutable.WrappedString – gzm0

+0

хороший момент, но как насчет Int? Он расширяет оригинальные черты Scala, такие как «AnyVal», могут ли они не помечать AnyVal как неизменяемые для согласованности? – LaloInDublin

+0

Я подозреваю, что 'Immutable' фактически был определен для определения изменяемых структур данных, таких как map, set, list и т. Д., В отношении их изменяемых копий. Он не был предназначен для родовых классов. –

ответ

2

Единственные прямые подтипы Immutable в основной библиотеке Scala являются:

  • collection.immutable.Traversable
  • collection.parallel.immutable.ParIterable

Ничто другое не относится к Immutable вообще.

Immutablehasn't been changed с добавлением в 2009 году в «massive new collections checkin» от Martin Odersky. Я просматриваю это сообщение, и похоже, что Immutable никогда не использовался в качестве привязки, когда он был впервые введен.

Честно говоря, я сомневаюсь, что за этими чертами уже много намерений. Odersky, вероятно, планировал использовать Immutable, чтобы связать аргументы типа с неизменяемыми коллекциями, а затем подумал об этом лучше. Но это только мои предположения.

2

Так называемые примитивные типы (Boolean, Byte, Char, Short, Int, Long, Float, Double) по своей сути неизменен. 5 - 5. 5. Вы ничего не можете сделать до 5, чтобы превратить его во что-то, что не является 5.

В противном случае неизменность - это свойство того, как хранится значение. Если сохранено в var, то var можно свободно заменить новым значением (совместимого типа). По существу, построенные типы (class es, 5 и object s) могут быть либо неизменяемыми, либо изменяемыми в зависимости от того, разрешают ли они изменять их внутреннее состояние после строительства.

Java String (также используется как Scala's String) является неизменным.

Однако, ничто из этого не имеет никакого отношения к вам, например, поскольку вы не демонстрировали изменчивость. Вы просто показали, что происходит, если применить метод + одного значения к другому значению.

Хотя возможно, что можно реализовать метод +, который мутирует его (видимый) левый операнд, редко это делает. Если есть необходимость в такой мутации, можно было бы вместо этого определить метод +=.

+ несколько особенного в том, что оно может быть применено к любому значению (если аргумент/правый операнд) является String силу неявного преобразования в специальный класс, который определяет +(s: String) так, что интерпретация строки конкатенация +. Другими словами, если вы пишете e1 + "e2" и тип выражения e1 не определяет +, то Scala преобразует e1 в String и объединит его с "e2".

+0

У меня есть + помощь ... спасибо! – LaloInDublin

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