Julia ifelse 中使用 isassigned 的意外行为

Max*_*Max 1 julia

test = [1, 1, 1, 1]
ifelse(isassigned(test, 5), test[5], "nope")
Run Code Online (Sandbox Code Playgroud)

对我来说,这应该产生字符串“nope”,但我得到

BoundsError: attempt to access 4-element Array{Int64,1} at index [5]
Run Code Online (Sandbox Code Playgroud)

这是错误还是预期的功能?

现在,我正在使用

if isassigned(test, 5) test[5] else "nope" end
Run Code Online (Sandbox Code Playgroud)

但这在列表理解中不是很清晰。

Bog*_*ski 5

用:

julia> isassigned(test, 5) ? test[5] : "nope"
"nope"
Run Code Online (Sandbox Code Playgroud)

这应该更具可读性。

ifelse评估所有的参数。这种行为的后果最好用ifelsedocstring 来描述:

这与?or不同if在于它是一个普通函数,因此首先评估所有参数。在某些情况下,使用ifelse代替if语句可以消除生成代码中的分支并在紧密循环中提供更高的性能。