#string #types #clojure
#строка #типы #clojure
Вопрос:
В Clojure я создаю карточную игру. Карты имеют масть и счет.
{:suit 1 :score 9}
Карты создаются с использованием диапазонов, например (диапазон suitTotal), поэтому класс значений :suit и :score является длинным.
Игроки отправляют командные строки, например, «discard1.9» — это запрос на удаление.
Использование регулярного выражения для анализа этого:
(re-seq #"[0-9] " command)
результаты в строковых элементах «1» и «9». Карточка, созданная с этими результатами, будет
{:suit "1" :score "9"}
Я бы хотел, чтобы это сравнивалось как равное с исходной картой. На данный момент я использую (Integer / parseInt) для преобразования строк.
Значение suit может быть построено из другого типа, такого как ключевое слово, но значение score используется как число в другом месте.
Комментарии:
1. Итак, вы прочитали числа как строки и проанализировали их. В чем вопрос?
2. Кроме этой области, программа является clojure. Использование Integer / parseInt похоже на использование java interop и type соображений, когда для достижения этой цели должен быть более идиоматический способ clojure.
3. @JamesPetry: 1 но… Любопытство убило кошку: почему вы используете такие обозначения, как «discard1.9» ? Это кажется не очень удобным для чтения: обычно в покерном программном обеспечении (трекеры, оценщики рук и т. Д.) Вы найдете обозначения типа «Ac» , а не «1.9» (где «Ac» означает «Туз треф»).). Даже если это просто внутренняя ваша отладка / трассировка / комментирование звучит так, как будто это можно было бы облегчить, если бы вы сохраняли обозначения, близкие к «реальным», нет !? Также обычно у игрока есть карты «x», и он не говорит «Я сбрасываю Ac» , он говорит «Я сбрасываю 2-ю карту из моей руки» (я имею в виду, с точки зрения программного обеспечения)
4. @JamesPetry: особенно видно со стороны другого игрока: все, что они видят, это «Игрок x сбросил свою 2-ю и 5-ю карту» , и они не знают, что это за карты. Если вы сделаете это с помощью «отбросить 1.9» , вам нужно будет затем вычислить местоположение «1.9», чтобы узнать, какая карта была сброшена… Что кажется странным, поскольку у вас была эта информация в первую очередь, когда игрок нажимал на карты, прежде чем отбросить их. Кроме того, когда «истории рук» записываются на диск, другие игроки не должны знать, какие карты были сброшены другими. Я бы выбрал «Показывает переменный ток» и «Сбрасывает 3-ю карту» и т. Д.
Ответ №1:
используйте read-string
ДЕМОНСТРАЦИЯ
user=> (read-string "1")
1
Комментарии:
1. может быть опасно при вводе пользователем ….. если вы не отключите * real-eval *, то это можно использовать для выполнения произвольного кода.
Ответ №2:
Хорошим подходом было бы проанализировать строки как числа, а затем использовать = для сравнения.
user=> (Integer/parseInt "1")
1
Преимущество этого перед строкой чтения заключается в том, что это более ограничено. Это не будет анализировать строки, которые выглядят как структуры данных clojure.