如何使用 map 等 while 条件制作类型稳定的生成器?

How to make type stable generator with a while condition like map?

假设我正在模拟一个实验,但我不知道该步骤何时终止。使用 while 条件并推送到 Any 数组,函数类型不稳定。

function simulate()
    result = []
    alive = true
    while alive
        push!(result,alive)
        alive = rand(Bool)
    end
    return result
end

有没有办法以类型稳定的方式完成此操作?

在这种特殊情况下有一个非常简单的修复方法!你可以指定一个空的 Array{Bool} 而不是你当前得到的 Array{Any} ,只需写 Bool[] 代替 []:

function simulate()
    result = Bool[]
    alive = true
    while alive
        push!(result,alive)
        alive = rand(Bool)
    end
    return result
end

查看此修改函数的 @code_warntype 的输出,我们可以看到结果现在被稳定地推断为 Vector{Bool}

julia> @code_warntype simulate()
MethodInstance for simulate()
  from simulate() in Main at REPL[13]:1
Arguments
  #self#::Core.Const(simulate)
Locals
  alive::Bool
  result::Vector{Bool}
Body::Vector{Bool}
1 ─     (result = Base.getindex(Main.Bool))
│       Main.sizehint!(result, 50)
└──     (alive = true)
2 ┄     goto #4 if not alive
3 ─     Main.push!(result, alive::Core.Const(true))
│       (alive = Main.rand(Main.Bool))
└──     goto #2
4 ─     return result