为什么Elixir的String.capitalize()功能是小写的剩余字母?



Elixir的String.capitalize/2函数"将给定字符串中的第一个字符转换为大写并且将其余字符转换为小写";。将第一个字符大写并保持其余字符不变不是更直观吗?也许有什么原因让我失踪了?

当前的实现导致the local ATM->The local Atmforgotten PIN->Forgotten Pin

这里有一个不需要调用未记录的特定于实现的String.Casing的解决方案。

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

以上也适用于unicode字符(组合和分解(:

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

这是用于资本化的elixir api。

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

从性能的角度来看,第二个实现更好。所以,我相信通过elixir保留这个capitalize/2实现的唯一原因是,大多数开发人员都希望它能以这种方式工作。

这个答案让我对本可以绕过它的推理普遍感到好奇

对于任何想在不编写自定义函数的情况下实现这一点的人来说,以下是我在需要时的操作方法:

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

JFYI对于任何在谷歌上搜索的人来说:(

更新:不要这样做!根据https://elixirforum.com/t/string-capitalize-should-have-a-leave-the-rest-of-the-word-alone-option/31095/2?u=slouchpie使用Casing.titlecase_once是危险的

适用于那些正在寻找字符串中每个单词的大写字母(但找不到(的人。

capitalize_words = fn string ->
String.split(" ")
|> Enum.map(& String.capitalize(&1))  # or Enum.map(& (String.capitalize/1))
|> Enum.join(" ")
end

结果:

iex> capitalize_words.("hello to every human being!")
"Hello To Every Human Being!"

最新更新