【问题标题】:How to check if a string is blank in Elixir如何检查 Elixir 中的字符串是否为空白
【发布时间】:2021-09-08 19:08:30
【问题描述】:

我的意思是如果字符串为空或仅包含空格,则字符串为空。 比如""" ""\n"都是空白的。

在 Rails 中,我们有 .blank? 方法。

Elixir(或 Phoenix 框架)中有类似的东西吗?

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    String.trim/1 似乎从 Elixir 1.3.0 开始就可以解决问题。

    strip 仍然有效,但它已被软弃用 in the 1.3.0 release 并且未在 the String docs 中列出。

    【讨论】:

    • 不像在 Rails 中那样对 nil 不起作用,因此需要更详细的解决方案。这将引发错误:String.trim(nil)
    【解决方案2】:

    String.strip/1 会将您的 3 个示例转换为您可以比较的 ""

    iex(4)> String.strip("\n") == ""
    true
    iex(5)> String.strip("") == ""  
    true
    iex(6)> String.strip("    ") == ""
    true
    

    有一个关于它的问题https://github.com/elixir-lang/elixir/pull/2707

    【讨论】:

    • 如果我想在警卫内这样做怎么办?
    • strip 在 Elixir > 1.3.0 中已被软弃用。 github.com/elixir-lang/elixir/releases/tag/v1.3.0
    • @nicooga 如果您只想检查守卫内的空字符串,请尝试:when binary_part(string, 1, -1)
    • @Chris Keele 不适用于任何情况。
    【解决方案3】:

    我发布了一个小型库来为任何数据类型正确执行此操作。它尽可能实现与 Elixir 中 Rails 的 blank? 方法相同的行为。

    图书馆在这里:https://github.com/samphilipd/blankable

    要安装,请将空白添加到 mix.exs 中的依赖项列表中:

    def deps do
      [{:blankable, "~> 0.0.1"}]
    end
    

    【讨论】:

      【解决方案4】:

      为什么不直接使用模式匹配

      iex> a = ""
      ""
      iex> b = "b"
      "b"
      iex> ^b = "b"
      "b"
      iex> ^a = "your String"
      ** (MatchError) no match of right hand side value: ""
      iex> ^a = ""
      ""
      

      或者更好的是检查它的字节大小

      iex> if byte_size("") == 0 do true else false end
      true
      iex> if byte_size("a") == 0 do true else false end
      false
      

      【讨论】:

      • 我才刚开始学习 Elixir,但即使是新手,我也发现模式匹配是惯用的方法。
      • 不建议使用字符串进行模式匹配。
      • @tblev 用于单字符匹配我相信没问题。看起来不推荐用于长度未知的字符串。
      【解决方案5】:

      我今天也有同样的问题。我最终定义了这些函数:

      defmodule Hello do 
        def is_blank(nil), do: true
        def is_blank(val) when val == %{}, do: true
        def is_blank(val) when val == [], do: true
        def is_blank(val) when is_binary(val), do: String.trim(val) == ""
        def is_blank(val), do: false
      end
      
      import Hello 
      
      is_blank nil 
      is_blank [] 
      is_blank %{} 
      is_blank "" 
      
      is_blank ["A"] 
      is_blank %{a: "A"} 
      is_blank "A" 
      

      【讨论】:

      • 第三个将匹配任何地图。
      • @LowFieldTheory 你是绝对正确的。我修复了我的代码。
      【解决方案6】:

      这在大多数情况下对我有用,并且与 Ruby 中的 is_blank? 非常相似。

      def is_blank?(data), do: (is_nil(data) || Regex.match?(~r/\A\s*\z/, data))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-25
        • 2012-03-23
        • 2015-06-12
        相关资源
        最近更新 更多