gpt4 book ai didi

elixir - 为什么范围相等在守卫中不起作用?

转载 作者:行者123 更新时间:2023-12-05 01:50:10 24 4
gpt4 key购买 nike

我想编写一个函数,在给定范围和值 n 的情况下,检查范围是否恰好跨越 n..n。我的第一次尝试看起来像这样,但没有预期的行为(注意第一个返回值是 false)

defmodule Range do
def equal?(n, range) when range == n..n, do: true
def equal?(n, range), do: false
end

IO.puts(Range.equal?(1, 1..1)) # false
IO.puts(Range.equal?(1, 1..5)) # false

但是,如果我改变方法以在 range 参数上使用模式匹配,我可以生成一个有效的函数。

defmodule Range do
def equal?(n, n..n), do: true
def equal?(n, range), do: false
end

IO.puts(Range.equal?(1, 1..1)) # true
IO.puts(Range.equal?(1, 1..5)) # false

看看这两者,我不清楚为什么它们不等价。如果我将 when range == n..n 替换为 when range == 1..1 这将按预期工作(显然仅适用于 n = 1)。

这是为什么?

最佳答案

这是 中的错误核心。

在常规上下文中,除非通过 //step 明确指定,Range 结构的 step 明确设置为 1 ,而在守卫内部它被设置为 nil:https://github.com/elixir-lang/elixir/blob/v1.13.4/lib/elixir/lib/kernel.ex#L3805-L3818

defmodule R do
def equal1?(n, range) when range == %Range{first: n, last: n, step: 1}, do: true
def equal1?(_n, _range), do: false

def equal2?(n, range) when range == n..n//1, do: true
def equal2?(_n, _range), do: false

def equal3?(n, range) when range == n..n, do: true
def equal3?(_n, _range), do: false
end

iex|💧|1 ▸ R.equal1? 1, 1..1
true
iex|💧|2 ▸ R.equal2? 1, 1..1
true
iex|💧|3 ▸ R.equal3? 1, 1..1
false

我将提供一个 pull request 来解决这个问题,感谢您的报告。

不幸的是,对于动态的 firstlast 值,没有办法推断出正确的步骤(虽然对于相同的值仍然有可能,或者人们可能会盲目地推断出 1,这两个解决方案都不完整且不可靠。)

也就是说,请使用步长 n..n//1 的格式良好的现代范围,使其按预期在守卫中工作。

关于elixir - 为什么范围相等在守卫中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73349209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com