4 回答

TA貢獻1784條經驗 獲得超8個贊
Elixirif也有變量和表達式,因此您真正需要做的就是while True用遞歸調用替換:
def something() do
x = function()
y = function()
if x != y do
x
else
something()
end
end

TA貢獻1860條經驗 獲得超8個贊
遞歸是你的朋友
def something do
x = function()
y = function()
if x != y, do: x, else: something()
end

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()
在許多情況下,這種解決方案更為可靠。

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
,否則將執行。
但我不得不承認,波蒂巴斯的答案非常簡單,而且可能是一個很好的妥協。我認為我一般更喜歡函數子句方式,因為它使參數明確并隱藏更少的副作用。
添加回答
舉報