【发布时间】:2021-04-07 04:08:17
【问题描述】:
Elixir 的 String.capitalize/2 函数“将给定字符串中的第一个字符转换为大写,其余字符转换为小写”。将第一个字符大写而其余字符保持不变不是更直观吗?也许我缺少一些推理?
当前实现结果为the local ATM -> The local Atm、forgotten PIN -> Forgotten Pin 等
【问题讨论】:
标签: elixir
Elixir 的 String.capitalize/2 函数“将给定字符串中的第一个字符转换为大写,其余字符转换为小写”。将第一个字符大写而其余字符保持不变不是更直观吗?也许我缺少一些推理?
当前实现结果为the local ATM -> The local Atm、forgotten PIN -> Forgotten Pin 等
【问题讨论】:
标签: elixir
这是调用大写的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
从性能的角度来看,第二次实施更好。所以,我相信保留这个 capitalize/2 实现由 elixir 的唯一原因是因为大多数开发人员都希望它能够以这种方式工作。
这个答案让我普遍对可能绕过它的推理感到好奇。 :)
【讨论】:
这是一个不需要调用未记录的特定实现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"
【讨论】:
<<c>> 语法?我在哪里可以找到这方面的文档?
c 是一个字节,<<c>> 使它成为二进制。
对于希望在不编写自定义函数的情况下执行此操作的任何人,以下是我在需要时执行此操作的方法:
"the local ATM"
|> String.Casing.titlecase_once(:default)
|> Tuple.to_list
|> Enum.join
任何搜索此内容的人都可以参考 :)
更新:不要这样做!根据https://elixirforum.com/t/string-capitalize-should-have-a-leave-the-rest-of-the-word-alone-option/31095/2?u=slouchpie 使用Casing.titlecase_once 是危险的
【讨论】: