为什么 Elixir 的 String.capitalize() 函数会小写剩余的字母?

问题描述 投票:0回答:4

Elixir 的

String.capitalize/2
函数“将给定字符串中的第一个字符转换为大写,将其余字符转换为小写”。将第一个字符大写并保持其余字符不变不是更直观吗?也许我缺少一些推理?

当前的实施结果为

the local ATM
->
The local Atm
,
forgotten PIN
->
Forgotten Pin

elixir
4个回答
4
投票

这是一个解决方案,不需要调用未记录的特定实现

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"

4
投票

这是需要大写的 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
实现是因为大多数开发人员都希望它以这种方式工作。

这个答案让我对可能绕过它的推理感到好奇。 :)


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


0
投票

对于正在寻找将字符串中的每个单词大写(但找不到)的人。

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!"
© www.soinside.com 2019 - 2024. All rights reserved.