4 回答
![?](http://img1.sycdn.imooc.com/545845d30001ee8a02200220-100-100.jpg)
TA贡献1784条经验 获得超8个赞
Elixirif也有变量和表达式,因此您真正需要做的就是while True用递归调用替换:
def something() do
x = function()
y = function()
if x != y do
x
else
something()
end
end
![?](http://img1.sycdn.imooc.com/545868330001e54e02200220-100-100.jpg)
TA贡献1860条经验 获得超8个赞
递归是你的朋友
def something do
x = function()
y = function()
if x != y, do: x, else: something()
end
![?](http://img1.sycdn.imooc.com/5333a1920001d36402200220-100-100.jpg)
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()
在许多情况下,这种解决方案更为可靠。
![?](http://img1.sycdn.imooc.com/545861f00001be3402200220-100-100.jpg)
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
,否则将执行。
但我不得不承认,波蒂巴斯的答案非常简单,而且可能是一个很好的妥协。我认为我一般更喜欢函数子句方式,因为它使参数明确并隐藏更少的副作用。
添加回答
举报