为了账号安全,请及时绑定邮箱和手机立即绑定

Elixir 相当于 while true

Elixir 相当于 while true

长风秋雁 2023-07-11 14:53:18
我想在 Elixir 中重写这个方法(这里用 Python 编写)def something()    while True:        x = function()        y = function()        if x != y:            return x    function()生成一个随机值,因此执行迟早会结束。while True我的问题是尽可能以最“实用的方式”翻译。我想出了这个解决方案,但我认为可读性不是很好。def something() do    internal(function(), function())enddefp internal(a, a) do    internal(function(), function())enddefp internal(a, _) do    aend有更好的方法吗?PS:function()每个周期必须调用两次,并且不能重写。谢谢
查看完整描述

4 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

Elixirif也有变量和表达式,因此您真正需要做的就是while True用递归调用替换:


  def something() do

    x = function()

    y = function()


    if x != y do

      x

    else

      something()

    end

  end


查看完整回答
反对 回复 2023-07-11
?
桃花长相依

TA贡献1860条经验 获得超8个赞

递归是你的朋友


  def something do

    x = function()

    y = function()

    if x != y, do: x, else: something()

  end


查看完整回答
反对 回复 2023-07-11
?
BIG阳

TA贡献1859条经验 获得超6个赞

为了多样性,这里不是基于Stream.iterate/2和 的递归答案Stream.take_while/2。请注意,可以使用任何无限流生成器来代替iterate/2,例如Stream.cycle/1

0

|> Stream.iterate(&(&1 + 1))

|> Stream.map(fn _ -> {f1(), f2()} end)

|> Stream.take_while(fn {x, y} -> x != y end)

|> Enum.to_list()

在许多情况下,这种解决方案更为可靠。


查看完整回答
反对 回复 2023-07-11
?
阿晨1998

TA贡献2037条经验 获得超6个赞

我认为你的解决方案还不错,只是习惯于看到多个函数子句在起作用。您可以稍微重新排列它以使其更具可读性,但这只是个人喜好。

def something(), do: something(nil, nil)
defp something(x, x), do: something(function(), function())
defp something(x, _y), do: x

(x, x)当参数相等时,该子句将被执行。

(x, _y)子句仅返回x,否则将执行。

但我不得不承认,波蒂巴斯的答案非常简单,而且可能是一个很好的妥协。我认为我一般更喜欢函数子句方式,因为它使参数明确并隐藏更少的副作用。


查看完整回答
反对 回复 2023-07-11
  • 4 回答
  • 0 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信