通过重新为变量赋值来循环Elixir

Oto*_*oma 1 loops elixir while-loop

我想在Elixir中编码这个算法:

var name = generate_name();
while (check_if_exists(name)) {
  name = generate_name();
}
Run Code Online (Sandbox Code Playgroud)

我无法在Elixir中以相同的方式编码,因为必须有更多的惯用和功能方式.那怎么办呢?

She*_*yar 7

Elixir是一种不可变的编程语言.这意味着您无法修改变量的值,只能重新绑定它.因此,Elixir中不存在经典的 .

但是,您可以使用递归实现它:

def get_name do
  name = generate_name()

  case check_if_exists(name) do
    true  -> get_name()
    false -> name
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 不,您无法更改变量的值 - 您只能将其重新绑定到其他值. (10认同)
  • 如果/ else只是case语句的宏,上面有true/false代码. (3认同)

Pat*_*ity 6

另一种可能性是创建无限的名称流,然后找到可用的第一个名称:

Stream.repeatedly(&generate_name/0)
|> Enum.find(&check_if_exists/1)
Run Code Online (Sandbox Code Playgroud)