Практические примеры использования символов в Scala?

Из того, что я знаю, wchar_t является зависящим от реализации (как видно из этого статья Wiki). И это не unicode.

62
задан Jesper 24 August 2009 в 20:08
поделиться

6 ответов

Действительно ли символы вписываются в Scala?

В чудесной стране Лиспа код представлен в виде вложенных списков литеральных объектов, которые обозначают себя (строки, числа и т. Д.), И символы, которые используются в качестве идентификаторов для таких вещей, как классы, функции и переменные. Поскольку код Lisp имеет очень простую структуру, Lisp позволяет программисту манипулировать им (как во время компиляции, так и во время выполнения). Ясно, что при этом программист неизбежно столкнется с символами как объектами данных.

Таким образом, символы являются (и должны быть) объектами в Лиспе в любом случае, так почему бы не использовать их как ключи хеш-таблицы или как перечисления? Это естественный способ делать вещи, и он сохраняет язык простым, поскольку вам не нужно определять специальный тип перечисления.

Подводя итог, символы естественным образом используются для манипулирования кодом, перечисления и т. Д. и ввод. Но люди, использующие Java, по умолчанию не используют идентичность в качестве отношения эквивалентности между хэш-ключами (что и делает ваш традиционный Lisp), поэтому они могут просто использовать строки в качестве своих ключей. Типы Enum определяются в Scala отдельно. И, наконец, код как данные вообще не поддерживается языком.

Итак, нет, у меня сложилось впечатление, что символы не принадлежат языку Scala. Тем не менее, я буду следить за ответами на этот вопрос. Они могут по-прежнему демонстрировать подлинное использование символов в Scala, о котором я не могу сейчас подумать.

( Приложение: В зависимости от диалекта Лиспа, символы Лисп также могут быть квалифицированы пространством имен, что является Конечно, это чрезвычайно полезная функция при работе с кодом, которой нет у строк.)

• использовать идентичность как отношение эквивалентности между хеш-ключами по умолчанию (что и делает ваш традиционный Лисп), поэтому они могут просто использовать строки в качестве своих ключей. Типы Enum определяются в Scala отдельно. И, наконец, код как данные вообще не поддерживается языком.

Итак, у меня сложилось впечатление, что символы не принадлежат языку Scala. Тем не менее, я буду следить за ответами на этот вопрос. Они могут по-прежнему демонстрировать подлинное использование символов в Scala, о котором я не могу сейчас думать.

( Приложение: В зависимости от диалекта Лиспа, символы Лисп также могут быть квалифицированы пространством имен, что является Конечно, это чрезвычайно полезная функция при работе с кодом, которой нет у строк.)

• использовать идентичность как отношение эквивалентности между хеш-ключами по умолчанию (что и делает ваш традиционный Лисп), поэтому они могут просто использовать строки в качестве своих ключей. Типы Enum определяются в Scala отдельно. И, наконец, код как данные вообще не поддерживается языком.

Итак, у меня сложилось впечатление, что символы не принадлежат языку Scala. Тем не менее, я буду следить за ответами на этот вопрос. Они могут по-прежнему демонстрировать подлинное использование символов в Scala, о котором я не могу сейчас думать.

( Приложение: В зависимости от диалекта Лиспа, символы Лисп также могут быть квалифицированы пространством имен, что является Конечно, это чрезвычайно полезная функция при работе с кодом, которой нет у строк.)

поэтому они могут просто использовать строки в качестве ключей. Типы Enum определяются в Scala отдельно. И, наконец, код как данные вообще не поддерживается языком.

Итак, нет, у меня сложилось впечатление, что символы не принадлежат языку Scala. Тем не менее, я буду следить за ответами на этот вопрос. Они могут по-прежнему демонстрировать подлинное использование символов в Scala, о котором я не могу сейчас подумать.

( Приложение: В зависимости от диалекта Лиспа, символы Лисп также могут быть квалифицированы пространством имен, что является конечно, чрезвычайно полезная функция при работе с кодом и функция, которой нет у строк.)

поэтому они могут просто использовать строки в качестве ключей. Типы Enum определяются в Scala отдельно. И, наконец, код как данные вообще не поддерживается языком.

Итак, нет, у меня сложилось впечатление, что символы не принадлежат языку Scala. Тем не менее, я буду следить за ответами на этот вопрос. Они могут по-прежнему демонстрировать подлинное использование символов в Scala, о котором я не могу сейчас подумать.

( Приложение: В зависимости от диалекта Лиспа, символы Лисп также могут быть квалифицированы пространством имен, что является конечно, чрезвычайно полезная функция при работе с кодом и функция, которой нет у строк.)

они принадлежат языку Scala. Тем не менее, я буду следить за ответами на этот вопрос. Они могут по-прежнему демонстрировать подлинное использование символов в Scala, о котором я не могу сейчас подумать.

( Приложение: В зависимости от диалекта Лиспа, символы Лисп также могут быть квалифицированы пространством имен, что является конечно, чрезвычайно полезная функция при работе с кодом и функция, которой нет у строк.)

они принадлежат языку Scala. Тем не менее, я буду следить за ответами на этот вопрос. Они могут по-прежнему демонстрировать подлинное использование символов в Scala, о котором я не могу сейчас думать.

( Приложение: В зависимости от диалекта Лиспа, символы Лисп также могут быть квалифицированы пространством имен, что является Конечно, это чрезвычайно полезная функция при работе с кодом, которой нет у строк.)

33
ответ дан 24 November 2019 в 16:50
поделиться

Думаю, Scala добавила их, потому что их используют функциональные языки.

Однако они забыли добавить возможность ссылки на идентификатор через символ, что является своего рода центральной точкой их существование. В Scala 2.8 есть экспериментальная функция, которая дает кое-что из этого. Я процитирую соответствующую часть документации API полностью:


@experimental

object Invocation 
extends AnyRef

Более удобный синтаксис для рефлексивного вызова. Пример использования:

    class Obj { private def foo(x: Int, y: String): Long = x + y.length }

Вы можете вызвать его рефлексивно одним из двух способов:

    import scala.reflect.Invocation._
    (new Obj) o 'foo(5, "abc")                 // The 'o' method returns Any
    val x: Long = (new Obj) oo 'foo(5, "abc")  // The 'oo' method casts to expected type.

Если вы вызовете метод oo и не предоставите инструменту вывода типов достаточно помощи, он, скорее всего, выведет Ничего , что приведет к исключению ClassCastException .

Автор Пол Филлипс

15
ответ дан 24 November 2019 в 16:50
поделиться

Я полагаю, вы могли бы использовать их, когда хотите сослаться на имя предмета, который не существует в коде идентификатора. В книге Scala приводится пример ссылки на имя столбца базы данных - это не произвольная строка, это на самом деле имя объекта.

Это немного неубедительно, но я не совсем уверен.

3
ответ дан 24 November 2019 в 16:50
поделиться

Я считаю, что сравнение символов происходит быстрее. Если вы использовали Erlang, символы используются очень часто при передаче сообщений, и вам нужно что-то дешевое и быстрое, которое хорошо работает через границы машины. Я не уверен, в каком состоянии находятся удаленные акторы в Scala, IIRC, они были довольно хитрыми, но в будущем, когда они будут на месте, символы могут быть очень полезны во многом так же, как и в Erlang. Кроме того, классы регистра, некоторые преимущества не так очевидны, опять же, символы все еще дешевле.

5
ответ дан 24 November 2019 в 16:50
поделиться

Согласно книге Scala, символы интернированы: « Если вы напишите один и тот же символ дважды, оба выражения будут относиться к одному и тому же объекту Symbol . "

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

Но я согласен со skaffman, я не полностью убеждены в их использовании.

(В Ruby, Symbol , помимо приведенного вами примера метапрограммирования, часто используются в качестве ключей в Hash es. В Ruby это полезно, потому что там String никогда не интернируются: каждая Строка выделяет новую память. В Scala это может быть полезно, как я уже упоминал, если вы объедините его с большим количеством (де) сериализации, чтобы строки Java String также не интернировались.)

15
ответ дан 24 November 2019 в 16:50
поделиться

Поискав немного в Интернете, кажется, что смысл символов (символьных литералов) в (таком языке, как) Scala в сравнении со строками - это вопрос семантики и, возможно, даже осведомленности компилятора.

"Строка" - это тип данных, состоящий из последовательности символов. Вы можете оперировать со строками и таким образом манипулировать ими. Семантически строки могут быть любыми текстовыми данными, от имени файла до сообщения для вывода на экран, строки в CSV-файле или чего угодно.

Для компилятора - и, соответственно, IDE - строки являются значениями типа данных String, как числа (последовательности цифр) являются значениями типа данных, скажем: Integer . На уровне программы нет никакой разницы между "foo" и "bar".

Символы же являются идентификаторами, т.е. семантически идентифицируют элемент в программе. В этом отношении они похожи на имена классов, имена методов или имена атрибутов. Но если имя класса идентифицирует класс - т.е. набор свойств, объявляющих структуру и поведение класса, а имя метода идентифицирует метод - т.е. параметры и утверждения, то имя символа идентифицирует символ - т.е. его самого, не более того.

Таким образом, компилятор может явно различать символы 'foo и 'bar, как он различает классы Foo и Bar. Как часть таблицы символов компилятора, вы можете применить те же механизмы в IDE, например, для поиска использования 'foo (т.е. ссылок на этот символ), как вы ищете использование класса Foo.

Для сравнения, поиск строки "foo" потребует других подходов, например, полнотекстового сканирования. Это соответствует той же семантике, что и поиск всех вхождений символа 4711 в программном коде.

Вот как я это понимаю, кто-то может поправить меня, если я ошибаюсь.

18
ответ дан 24 November 2019 в 16:50
поделиться
Другие вопросы по тегам:

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