Почему функция String.capitalize () в Elixir выполняет строчные оставшиеся буквы? - PullRequest
1 голос
/ 03 августа 2020
Функция

Elixir String.capitalize/2 «преобразует первый символ данной строки в верхний регистр, а остаток в нижний регистр». Разве не было бы более интуитивно понятным использовать первый символ с большой буквы, а остальные символы оставить без изменений? Может быть, есть какая-то причина, по которой мне не хватает?

Текущая реализация приводит к the local ATM -> The local Atm, forgotten PIN -> Forgotten Pin et c.

Ответы [ 3 ]

3 голосов
/ 03 августа 2020

Это api elixir, который вызывается для использования заглавных букв.

def capitalize(string, mode) when is_binary(string) do
    {char, rest} = String.Casing.titlecase_once(string, mode)
    char <> downcase(rest, mode)
end

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

def capitalize_only_first(string, mode) when is_binary(string) do
    {char, rest} = String.Casing.titlecase_once(string, mode)
    char <> rest
end

Вторая реализация лучше с точки зрения производительности. Итак, я считаю, что единственная причина сохранить эту реализацию capitalize/2 с помощью elixir заключается в том, что большинство разработчиков ожидают, что она будет работать именно так. :)

2 голосов
/ 03 августа 2020

Вот решение, которое не требует вызова недокументированной конкретной реализации c String.Casing.

with <<c :: utf8, rest :: binary>> <- "the local ATM",
  do: String.upcase(<<c>>) <> rest

#⇒ "The local ATM"

Вышеупомянутое также работает с символами Юникода (как составными, так и разложенными):

with <<c :: utf8, rest :: binary>> <- "über BVG",
  do: String.upcase(<<c>>) <> rest

#⇒ "Über BVG"
2 голосов
/ 03 августа 2020

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

"the local ATM"
|> String.Casing.titlecase_once(:default)
|> Tuple.to_list 
|> Enum.join

JFYI для всех, кто ищет это в Google:)

...