【发布时间】:2021-09-08 19:08:30
【问题描述】:
我的意思是如果字符串为空或仅包含空格,则字符串为空。
比如""、" "和"\n"都是空白的。
在 Rails 中,我们有 .blank? 方法。
Elixir(或 Phoenix 框架)中有类似的东西吗?
【问题讨论】:
我的意思是如果字符串为空或仅包含空格,则字符串为空。
比如""、" "和"\n"都是空白的。
在 Rails 中,我们有 .blank? 方法。
Elixir(或 Phoenix 框架)中有类似的东西吗?
【问题讨论】:
String.trim/1 似乎从 Elixir 1.3.0 开始就可以解决问题。
strip 仍然有效,但它已被软弃用 in the 1.3.0 release 并且未在 the String docs 中列出。
【讨论】:
String.strip/1 会将您的 3 个示例转换为您可以比较的 ""。
iex(4)> String.strip("\n") == ""
true
iex(5)> String.strip("") == ""
true
iex(6)> String.strip(" ") == ""
true
【讨论】:
when binary_part(string, 1, -1)
我发布了一个小型库来为任何数据类型正确执行此操作。它尽可能实现与 Elixir 中 Rails 的 blank? 方法相同的行为。
图书馆在这里:https://github.com/samphilipd/blankable
要安装,请将空白添加到 mix.exs 中的依赖项列表中:
def deps do
[{:blankable, "~> 0.0.1"}]
end
【讨论】:
为什么不直接使用模式匹配
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
【讨论】:
我今天也有同样的问题。我最终定义了这些函数:
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"
【讨论】:
这在大多数情况下对我有用,并且与 Ruby 中的 is_blank? 非常相似。
def is_blank?(data), do: (is_nil(data) || Regex.match?(~r/\A\s*\z/, data))
【讨论】: