Какая функция предназначена к параметрам формата/замены {0} {1} в строке в Grails/Groovy?

После попытки сделать такие "функциональные" вещи в C# (и даже попытка книги по нему), я пришел к выводу, что не, за немногим исключением, такие вещи не помогают слишком много.

главная причина состоит в том, что языки, такие как F# получают много своего питания от того, чтобы действительно поддерживать эти функции. Не "можно сделать это", но "это просто, это ясно, это ожидается".

, Например, в сопоставлении с образцом, Вы получаете компилятор, говоря Вам, если существует неполное соответствие или когда другое соответствие никогда не будет поражаться. Это менее полезно с открытыми законченными типами, но при соответствии дизъюнктному объединению или кортежам, это очень изящно. В F# Вы ожидаете, что люди скопируют соответствие, и это немедленно имеет смысл.

"проблема" состоит в том, что, как только Вы начинаете использовать некоторые функциональные понятия, естественно хотеть продолжиться. Однако усиливая кортежи, функции, частичное приложение метода и приправление карри, сопоставление с образцом, вложенные функции, дженерики, поддержка монады, и т.д. в C# становится очень ужасной, очень быстро. Интересно, и некоторые очень умные люди сделали некоторые очень прохладные вещи в C#, но на самом деле использование это чувствует себя тяжелым.

, Что я закончил тем, что использовал часто (через проекты) в C#:

  • функции Последовательности, с помощью дополнительных методов для IEnumerable. Вещи как ForEach или Процесс ("Применяются"? - делают действие с объектом последовательности, поскольку это перечисляется), вписываются, потому что синтаксис C# поддерживает его хорошо.
  • шаблоны совместного заявления Абстракции. Сложные блоки попытки/выгоды/наконец или другой включенный (часто в большой степени универсальный) кодируют блоки. Расширение LINQ к SQL вписывается здесь также.
  • Кортежи, в некоторой степени.

**, Но действительно отметьте: отсутствие автоматического обобщения и вывода типа действительно препятствует использованию даже этих функций. **

Все это сказало, как кто-то еще упомянул, в малочисленной команде, для определенной цели, да, возможно, они могут помочь, если Вы застреваете с C#. Но по моему опыту, они обычно чувствовали себя подобно большему количеству стычки, чем они стоили - YMMV.

Некоторые другие ссылки:

7
задан 6 August 2009 в 08:31
поделиться

1 ответ

Эти маркеры фактически заменяются с помощью стандартных API-интерфейсов java.text.MessageFormat. Если вы отображаете сообщения с использованием тега Grail g: message, он заполнит пробелы, если вы передадите подходящий атрибут args = "...":

<g:message code="mymessagecode" args="${['size', 'org.example.Something']}"/>

При определенных обстоятельствах (на страницах GSP и из контроллеров IIRC) вы не можете вызвать тег как функция:

g.message(code:'mymessagecode',args: ['size', 'org.example.Something'])

Обратите внимание, что значение, передаваемое в качестве кода сообщения, является только символьной строковой константой. Фактический перевод (текст сообщения с «пробелами» в нем) будет прочитан фреймворком с использованием перезагружаемых пакетов ресурсов Spring.

Если все, что у вас есть на самом деле, это текст перевода, вы можете напрямую вызвать API форматирования сообщений. См., Например:

import java.text.MessageFormat

...

args = ["english"].toArray()
println(MessageFormat.format("Translation into {0}", args))

// Or - as the method is variadic:
println(MessageFormat.format("Translation into {0}", "english"))
8
ответ дан 7 December 2019 в 05:26
поделиться
Другие вопросы по тегам:

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