如何在Elixir中检查字符串是否为空

36

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

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

在Elixir(或Phoenix框架)中是否有类似的东西?

6个回答

34

3
无法像Rails一样处理nil,因此需要更冗长的解决方案。这将抛出错误:String.trim(nil)。 - Pierre Pretorius

17

2
如果我想在 guard 语句中执行该操作怎么办? - ichigolas
2
strip在Elixir > 1.3.0中已被软弃用。 https://github.com/elixir-lang/elixir/releases/tag/v1.3.0 - stevendaniels
3
如果你只是想在 guard 语句中检查空字符串,可以尝试:when binary_part(string, 1, -1) - Chris Keele
@Chris Keele 那对于任何情况都不起作用。 - sunofkyuss

5
我发布了一个微小的库,可以正确处理任何数据类型。它在Elixir中实现了与Rails的blank?方法尽可能相同的行为。
库在这里:https://github.com/samphilipd/blankable 要安装,请将blankable添加到mix.exs依赖项列表中:
def deps do
  [{:blankable, "~> 0.0.1"}]
end

5
为什么不直接使用模式匹配?
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

1
我刚开始学习Elixir,但即使作为新手,我也发现模式匹配是惯用的方式。 - David S.
不建议使用字符串模式匹配。 - tblev
1
@tblev 对于单个字符匹配,我认为这是可以的。但对于未知长度的字符串,似乎不建议使用。 - mjwrazor

1
我今天也有同样的问题。最终我定义了以下函数:
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" 

1
第三个将匹配任何映射。 - LowFieldTheory
1
@LowFieldTheory 你说得完全正确。我修复了我的代码。 - mnishiguchi

0

这对我来说在大多数情况下都有效,并且非常类似于 Ruby 中的 is_blank?

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接