Почему оператор + для List не поддерживается в Scala?

Если ваш <p:dataTable> использует ширины столбцов, такие как

<p:dataTable styleClass="myTable">
   <p:column width="100">

, и вы используете следующий CSS, чтобы скрыть заголовки столбцов

.myTable thead {
    display:none;
}

, вы также потеряете столбец ширины, установленные вами


Решение, чтобы скрыть заголовок столбца и сохранить ширину столбцов

.myTable thead th { 
    border: none !important; 
    background: none !important; 
}
13
задан Jens Schauder 23 January 2010 в 13:34
поделиться

4 ответа

Хороший вопрос, поэтому я нашел его в книге Одерского и др. В нем говорится следующее (надеюсь, это не нарушение авторских прав, цитируя это здесь; -)):


Почему бы не добавить в списки?

Класс Список не предлагает операцию добавления, потому что время требуется, чтобы добавить в список, растет линейно с размером списка, тогда как добавление в начало с помощью :: занимает постоянное время. Если вы хотите создать список, добавляя элементы, у вас есть возможность добавить их в начало, а когда вы закончите, вызовите reverse ; или используйте ListBuffer , изменяемый список, который предлагает операцию добавления, а когда вы закончите, вызовите toList .


Насколько я понимаю FP, добавление в начало списка встречается гораздо чаще, чем добавление, по крайней мере, в чисто функциональных языках. Я могу только предположить, что разработчики Scala добавили оператор + для удобства Java-разработчиков, которые привыкли добавлять с помощью add () , а затем задумались над этим.

16
ответ дан 1 December 2019 в 17:59
поделиться

Это было устарело в мае 2008 года в Revision 15071 , с сообщением:

устарели все проблематичные + методы и удалили те, которые никогда не появлялись в выпуске Отказ

Я ожидаю, что это было избежать неоднозначности со Stringaddd # +. Сравните разницу между 2.7.6 AN 2.8.0 Beta ниже:

Welcome to Scala version 2.7.6.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_15).
Type in expressions to have them evaluated.
Type :help for more information.

scala> List(1) + 2
warning: there were deprecation warnings; re-run with -deprecation for details
res0: List[Int] = List(1, 2)

scala> List(1) + "2"
warning: there were deprecation warnings; re-run with -deprecation for details
res1: List[Any] = List(1, 2)

В 2.8 метод был удален, и вы получаете:

Welcome to Scala version 2.8.0.Beta1-RC8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_15).
Type in expressions to have them evaluated.
Type :help for more information.

scala> List(1) + 2
<console>:5: error: type mismatch;
 found   : Int(2)
 required: String
       List(1) + 2
                 ^

scala> List(1) + "2"
res1: java.lang.String = List(1)2

Обновление

в списке Scala, Мартин Одирских нот:

Чтобы узнать, что действительно плохо Список № +, подумайте, что вы ожидаете Следующее для производства:

Список (1, 2, 3) + "является правильным Результат "

?

oxbow_Lakes добавляет - - - - Мне потребовалось некоторое время, чтобы распаковать этот загадочный комментарий, но я думаю, что то, что он нарушает коммутативность типов, подразумеваемых + Оператор. То есть тип A + B должен быть таким же, как тип B + A

обновление Разъяснение Мартина Одарского:

Что бы вы ожидали

списка (1, 2, 3) + «является правильным результатом»

для производства? Я ожидал, что строка: «Список (1, 2, 3) является правильным результатом».

С 2,7 списком стилей. +, Вы вместо этого Список [любой], список (1, 2, 3 », является правильный результат »).

Я классифицирую, что как плохой сюрприз. В Резюме, никогда не должно быть + Метод на коллекциях, которые являются ковариантными в своем типе элемента. Набор и карты не вариантны, поэтому У них может быть метод +. Все Скорее деликатный и грязный. Мы были бы лучше, если мы не пытались Дублируйте Java + для строки Concatenation. Но когда Scala получил разработана идея состояла в том, чтобы сохранить по сути, все выражение Java Синтаксис, включая строку +. И это Слишком поздно, чтобы изменить это сейчас.

14
ответ дан 1 December 2019 в 17:59
поделиться

Это не было коммутативно и было особенно субтимальным в списках. Кроме того, поведение отличается между подменными и неизменными коллекциями. На SCALA 2.8 у вас есть следующее:

element +: sequence   // prepend
sequence :+ element   // append
sequenece ++ sequence // concatenate

Мультиватная / неизменяемая вещь не совсем решена. Букет методов был устарел в качестве первого шага, но их нельзя изменить или отстранены без периода обеспокоения.

11
ответ дан 1 December 2019 в 17:59
поделиться

Если вы следите это Тема , вы увидите, что это, вероятно, для производительности.

Обычно следует организовать Список конструкции, чтобы не добавить. Список SCALA - это неизменный односвязный список, поэтому присоединение к концу это работает операция O (N).

lista ::: listb - это правое ассоциативность, и работает во времени пропорциональна длине lista « A ::: B '- это a / prefed / operation, который работает в o (a.length)

3
ответ дан 1 December 2019 в 17:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: