Является ли псевдопечатание на Erlang способом получения шрифтов? - PullRequest
1 голос
/ 19 марта 2010

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

{строка, "hjggjhhggJ"}

и список будет:

{list, [1,2,3]}

: Полагаю, я обнаружил, что сталкиваюсь с ситуациями, когда мне нужны типы, например, чтобы различать строки и списки, и я не уверен, что делать дальше. Однако я хочу использовать любую технику, которую выберу везде, в своем приложении Erlang для согласованности, а не только для строк и списков. Любой совет?

Обновление: Примером того, где я использую это, является ситуация, когда я храню значения данных в хранилище данных Riak, которое позволяет вам хранить списки или строки.

Ответы [ 4 ]

4 голосов
/ 19 марта 2010

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

Иногда, однако, может быть весьма полезно провести различие. В одном из моих проектов у меня была строка, которая проходила различные этапы экранирования в зависимости от того, что должно было произойти с входной строкой. Вывод строки, которая не была экранирована должным образом, может представлять угрозу безопасности. Чтобы сделать это более безопасным, я сделал теговый кортеж:

{my_string, false, false, ActualString}

И когда произошел один этап экранирования / обработки, я мог переключить логическое значение:

{my_string, true, false, ActualString}

, а затем функция вывода, которая получает строку, может соответствовать по определенным критериям:

output_html_escaped_string({my_string, true, _, ActualString}) -> ...

Таким образом, функция вызовет исключение, если я передам ей необработанную строку случайно (и я помню, что произошло один или два раза:).

2 голосов
/ 20 марта 2010

Да. Это также используется для различения нескольких конструкторов одного типа (не то, что на самом деле есть разница в Erlang). Например, многие функции в стандартной библиотеке указываются для возврата либо {error, Reason}, либо {ok, Value}.

1 голос
/ 22 мая 2014

в общем, вы, вероятно, не хотите делать {string, "ABC"}, что, вероятно, было бы более полезным, было бы что-то вроде {username, "ABC"} или тому подобное, где тег не относится к типу данных с точки зрения строки или списка, но как ваше приложение будет использовать эти данные. Таким образом, вы можете сопоставить шаблон с тем, что означают данные, а не с тем, чем они являются

Вы можете использовать охранники (хотя строка в erlang - это список символов)

1 голос
/ 23 марта 2010

Не уверен, что это то, что вам нужно, но вы можете использовать защитные выражения, чтобы различать типы. Пожалуйста, предоставьте больше информации / примеров по вашему вопросу, чтобы я мог помочь больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...