Juliaifelse中使用isassigned的意外行为
test = [1, 1, 1, 1]
ifelse(isassigned(test, 5), test[5], "nope")
对我来说,这应该产生字符串“nope”,但我得到
BoundsError: attempt to access 4-element Array{Int64,1} at index [5]
这是错误还是预期的功能?
现在,我正在使用
if isassigned(test, 5) test[5] else "nope" end
但这在列表理解中不是很清晰。
回答
用:
julia> isassigned(test, 5) ? test[5] : "nope"
"nope"
这应该更具可读性。
在ifelse
评估所有的参数。这种行为的后果最好用ifelse
docstring 来描述:
这与
?
or不同if
在于它是一个普通函数,因此首先评估所有参数。在某些情况下,使用ifelse
代替if
语句可以消除生成代码中的分支并在紧密循环中提供更高的性能。