【问题标题】:Why does Elixir's String.capitalize() function lowercase remaining letters?为什么 Elixir 的 String.capitalize() 函数将剩余字母小写?
【发布时间】:2021-04-07 04:08:17
【问题描述】:

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

当前实现结果为the local ATM -> The local Atmforgotten PIN -> Forgotten Pin

【问题讨论】:

    标签: elixir


    【解决方案1】:

    这是调用大写的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 的唯一原因是因为大多数开发人员都希望它能够以这种方式工作。

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

    【讨论】:

      【解决方案2】:

      这是一个不需要调用未记录的特定实现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"
      

      【讨论】:

      • 这太酷了!我不知道你可以像这样解构字符串。 “解构”是正确的词吗?
      • 这是模式匹配。
      • 为什么是&lt;&lt;c&gt;&gt; 语法?我在哪里可以找到这方面的文档?
      • 当然:elixir-lang.org/getting-started/…c 是一个字节,&lt;&lt;c&gt;&gt; 使它成为二进制。
      • @PeacefulJames 问题询问为什么 API 的行为如此,什么更直观,而不是如何以不同的方式进行。因此,如果您想决定应该发生什么,那么从技术上讲,这个问题应该被关闭,因为它主要是基于意见的。
      【解决方案3】:

      对于希望在不编写自定义函数的情况下执行此操作的任何人,以下是我在需要时执行此操作的方法:

      "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 是危险的

      【讨论】:

        猜你喜欢
        • 2021-01-24
        • 2012-01-20
        • 2021-10-22
        • 2013-06-25
        • 1970-01-01
        • 2017-04-10
        • 2020-09-15
        • 1970-01-01
        • 2013-02-04
        相关资源
        最近更新 更多