2017-04-11 140 views
0

我想这个算法在花好月圆编码:while循环灵药通过重新赋值给一个变量

var name = generate_name(); 
while (check_if_exists(name)) { 
    name = generate_name(); 
} 

我无法编码,在药剂以同样的方式因必有更地道和功能办法。那我该怎么做?

+0

一种方法是尝试将您的算法转换为地图/列表处理。可以将'generate_name()'或'check_if_exists()'作为处理地图/列表来实现 - 比如说可能/现有名称的地图/列表?有两种方法可以在map中使用http://elixir-lang.org/getting-started/keywords-and-maps.html或使用Ecto https://hexdocs.pm/ecto/Ecto进行数据库查询。 Query.html – GavinBrelstaff

回答

6

Elixir是Immutable programming language。这意味着你不能修改变量的值,只能重新绑定它。因此,Elixir中不存在经典

但是,你可以implement this using recursion

def get_name do 
    name = generate_name() 

    case check_if_exists(name) do 
    true -> get_name() 
    false -> name 
    end 
end 
+0

指导方针建议仅对3+个子句使用'case':'如果check_if_exists(name),do:get_name(),else:name'。 – mudasobwa

+0

我可以很好地更改Elixir –

+6

中某个变量的值,但不能更改变量的值 - 只能将其重新绑定为不同的值。 – sevenseacat

4

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

Stream.repeatedly(&generate_name/0) 
|> Enum.find(&check_if_exists/1)