Эликсир прописывать только первую букву слова - PullRequest
1 голос
/ 02 ноября 2019

У меня есть строка, которая мне нужна только для ввода первой буквы. Мне также нужно сохранить регистр любых последующих писем. Сначала я подумал:

String.capitalize("hyperText") 

поможет. Но в дополнение к исправлению первой буквы, он уменьшает количество остальных букв. То, что мне нужно в конечном итоге, это «Гипертекст». Мой начальный проход в этом:

<<letter :: utf8, rest :: binary>> = word
upcased_first_letter = List.to_string([letter])
|> String.upcase()

upcased_first_letter <> rest

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

Ответы [ 3 ]

2 голосов
/ 03 ноября 2019

Вы можете использовать with/1, чтобы сохранить его в одном выражении, и вы можете избежать List.to_string, снова используя оператор <<>> в результирующей кодовой точке:

with <<first::utf8, rest::binary>> <- "hyperText", do: String.upcase(<<first::utf8>>) <> rest

Или поместите это в функцию:

def upcaseFirst(<<first::utf8, rest::binary>>), do: String.upcase(<<first::utf8>>) <> rest
2 голосов
/ 03 ноября 2019

Если вы просто улучшаете английский алфавит, вы можете сделать легкую охранную оговорку в вашем матче. Пример анонимной функции, хотя бы по имени или with или что-то еще будет работать:

iex> cap_first = fn
...>   <<first, rest::binary>> when first in ?a..?z -> <<first - 32, rest::binary>>
...>   string -> string
...> end
iex> cap_first.("hyperText")
"HyperText"
1 голос
/ 03 ноября 2019

Один метод:

iex(10)> Macro.camelize("hyperText")
"HyperText"

Этот может быть более совместимым с UTF-8? Не уверен, сколько букв - это несколько кодовых точек, но это кажется немного безопаснее, чем предполагать, сколько байтов будет буква.

iex(6)> with [first | rest] <- String.codepoints("βool") do
...(6)> [String.capitalize(first) | rest] |> Enum.join()
...(6)> end
"Βool"
iex(7)> with [first | rest] <- String.codepoints("?ool") do
...(7)> [String.capitalize(first) | rest] |> Enum.join()
...(7)> end
"?ool"
iex(8)>
...