Почему Scala неявно преобразовывает Символ в Интервал?

После трех месяцев попытки выработать направление деятельности (LOB) приложение на WPF, я достиг точки рассмотрения, что возвращение к Windows Forms для моего проекта, и в исследовании мнений других людей, столкнулось с этим потоком...

Да, WPF является блестящей технологией, и он обладает преимуществами, которые охватывают далеко вне простой услады для глаз... шаблонная обработка и обязательные возможности являются яркими примерами. Целая объектная модель предлагает больше гибкости и более широких возможностей. Это, однако, не делает это defacto платформой для будущих Приложений отделов организации.

"проблемами", которые WPF решает с точки зрения разделения GUI от бизнес-логики, не являются проблемы, которые не могут быть с готовностью решены в Windows Forms путем простого запуска с правильной архитектуры и мышления. Даже контур объектов обязательные возможности WPF может быть воспроизведен в Windows Forms с некоторыми очень простыми классами помощника. Шаблонные возможности данных WPF очень хороши, но снова они - ничто, что Вы не можете моделировать в Windows Forms в тех редких случаях, когда Вы абсолютно не знаете точно, что возражает, что Вы собираетесь представить на любой данной части экрана.

, Где гонки Windows Forms вперед с точки зрения зрелости. Вы не можете качать мертвую кошку на Google, не поражая некоторый блог, где кто-то решил проблему Windows Forms для Вас. WPF, с другой стороны, имеет в наличии сравнительно меньше ресурсов изучения, меньше доступных пользовательских элементов управления, и не имел как многие его решенные проблемы роста.

На пике создания WPF по сравнению с решением Windows Forms должна быть зрелость среды разработки. Редакторы Windows Forms являются ловкими, быстро реагирующими и обладающими интуицией. Обратная связь об ошибках добирается до Вас немедленно, решения обычно очевидны, и компиляция-> отладка->, цикл редактирования в Windows Forms очень быстр.

приложения WPF, с другой стороны, имеют сравнительно жалостную поддержку режима разработки, с режимом конструктора, слишком готовым пойти на попятный при первом обнаружении ошибки, часто требуя сборки проекта после фиксации, прежде чем разработчик будет готов умереть снова. Drag'n'drop компонентов от панели инструментов не мог бы также поддерживаться, даваться обширный диапазон обстоятельств, при которых он или не работает вообще или приводит к абсолютно неинтуитивным результатам. Несмотря на обещание WpfToolkit, все еще нет применимого DataGrid для WPF, который приводит к любому виду разумной производительности или дружелюбия времени проектирования.

Отладка приложения WPF немного похожи стары ASP.NET, отлаживая парадигму... F5 хита-> ожидает-> запуск-> ошибка->, остановка-> фиксирует->, F5 хита-> ожидает-> запуск-> ошибка-> стон->, остановка-> фиксирует-> F5 хита.... Весь XAML, который выполняет Ваша программа, заблокирован, и разыскивающий XAML, определенные проблемы часто утомительны.

нижняя строка, проще говоря, то, что средства разработки для Windows Forms собираются иметь Вас строчащий фронтенды в части времени приложения WPF... особенно , если Вы создаете сетки основной детали или электронную таблицу как интерфейсы, которые имеет большая часть LOB. С Windows Forms Вы запускаете с 90% работы, уже сделанной для Вас.

я - огромный поклонник архитектуры WPF. Мне просто жаль, что комплект инструментальных средств времени проектирования не чувствовал себя подобно предварительной альфе отладочная сборка.

Редактирование: Этот ответ был отправлен о.NET 3.5 + Visual  Studio  2008, но.NET 4.0 с Visual Studio 2010 поставлется с сеткой данных WPF. В то время как много улучшений были сделаны к новому опыту разработки WPF, мой ответ здесь остается неизменным, и я хотел бы добавить следующее предложение:

, Если Вы спешите, чтобы сделать разработка RAD , пойдите с Windows Forms. Если Вы надеетесь производить хорошо спроектированный, удобный в сопровождении, масштабируемый, ресурс дружественное, многопользовательское приложение Направления деятельности, считайте ASP.NET MVC + HTML 5 + jQuery... Мои проекты с этими технологиями привели к лучшим результатам, раньше, для моих клиентов. MVC предлагает всю ту же шаблонную обработку, которую делает WPF, и jQuery включает анимации и сложные взаимодействия. Что еще более важно, ASP.NET MVC + решение jQuery не требует, чтобы Ваши конечные пользователи имели современные рабочие столы с достойным аппаратным обеспечением машинной графики.

9
задан Elazar Leibovich 26 September 2009 в 16:41
поделиться

2 ответа

Что ж, если вы подумаете о том, как представлен Char , то Char является просто 16-битным полем без знака с диапазоном от (От 0 до 2 ^ 16-1). Это может поместиться без переполнения в Int (32-битный знаковый, с диапазоном от -2 ^ 31 до 2 ^ 31-1).

Некоторые из базовых типов Scala в порядке длина их представления в битах:

  • Байт (8)
  • Char (16)
  • Int (32)
  • Long (64)

Все они подписаны, за исключением Char , и все они могут быть преобразованы в тип "ниже", поскольку они никогда не будут переполнены / недостаточны (кроме Byte в Char ], которого не существует). См. Все эти неявные преобразования в Predef .

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

def foo(c: Char) { println(c) }
foo('a' + 2) // prints c

Другое объяснение похоже на то, которое вы дали ( Char - это просто количество...). Для меня это имеет смысл - набор всех Chars включен в набор всех Int s, и, следовательно, применяю мои собственные рекомендации по использованию имплицитов , преобразование действительно должно быть неявным.

Я понимаю ваше раздражение, так как мне нравится, когда компиляторы сигнализируют об ошибках, подобных той, которую вы только что привели в качестве примера. Было бы неплохо, если бы в Scala был способ отключить неявное преобразование (или отключить определенные неявные преобразования, поскольку отключение их всех, вероятно, нанесет ущерб!)

Единственное решение, которое я вижу для вашей проблемы использует карту [RichChar, Int] или что-то подобное - RichChar неявно преобразуется в Int , поскольку неявные преобразования не могут быть связаны. EDIT обнаружил, что на самом деле не существует неявного преобразования из RichChar в Char .

def foo(x: Int) = x + 1

import scala.runtime.RichChar

val ch = 'a'
val rch = new RichChar('a')

foo(ch) // compiles fine
// foo(rch) // does not compile

def bar(ch: Char) = println(ch) 

// bar(rch) // oops... does not compile
implicit def rch2char(rch: RichChar): Char = rch.self.asInstanceOf[Char]

bar(rch) // yay!

EDIT : Фактически, если у вас есть хороший взгляд на Scala API, Char действительно имеет перегруженный метод + , который принимает аргумент Int . То же самое и с Int . Это могло быть связано с тем, что базовая JVM делает нечто подобное.

Также обратите внимание, что приведенный мной пример не имеет ничего общего с возможностью добавления Int s к Char s! Это уже разрешено API. Более тонкий момент заключается в том, что когда вы добавляете Int к Char , вы получаете Int . Неявное преобразование позволяет использовать результат этого добавления как Char .

Также обратите внимание на более теоретический ответ, который я дал - Char является подмножеством Int !

- Flaviu Cipcigan

5
ответ дан 3 November 2019 в 07:14
поделиться

Возможно, это не идеально, но рассмотрите альтернативу ...

Это просто вариант реализации. В какой-то момент многие языки действительно сильно различали char и int , но, поскольку в них всегда должны были быть функции преобразования, на самом деле они не очень сильно блокировали, а блокировали просто стало большой болью.

На самом деле никто не хочет возвращаться во времена chr (n) и ord (c) повсюду. Представьте, насколько увлекательной была бы обработка UTF-8.

Как только C выпустил char s на самом деле int s, это потрясло, и мы остались с этим даже во многих более строго типизированные языки.

Теперь, если вам действительно нужен инкапсулированный Char , который не конвертируется автоматически, ничто не мешает вам определить новый тип, например ElazarChar , для вашего собственного кода. Я подозреваю, что вам это не понравится.

0
ответ дан 3 November 2019 в 07:14
поделиться
Другие вопросы по тегам:

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