惰性条件评估最有效的方法是什么
What is the Most Rly Way for Lazy Conditional Evaluation
案例。我有一部分代码是这样的:if (exists("mybooleanvar") & mybooleanvar) {statement1} else {statement2}
。我希望如果条件被延迟(短路)评估,如果 mybooleanvar
未分配,statement1
将是 运行,如果 mybooleanvar
将调用 statement2
] 不存在或等于 FALSE
。
但在实践中,我收到一个 运行 时间错误,表明 mybooleanvar
的值已被访问并与 TRUE
if exists("mybooleanvar") == FALSE
进行比较。所以完整的布尔值计算发生了。
当然,这个问题可以通过封闭的 if 语句来解决,外部语句评估 exists()
和内部语句 - 布尔值。但是我想知道,如果尽管有进一步语句的值,但结果是已知的,那么正确避免评估条件语句的第 n 个成员的最 Rly 方法是什么。
例如,如果 statement1 == FALSE
,statement1 & statement2
将是 FALSE
。 statement1 | statement2
是 TRUE
如果 statement1 == TRUE
和 statement2
不需要检查(或者至少可以通过编译器指令 {$B-)
in Delphi).
这里我会用&&
代替&
。它们在两个方面有所不同(参见 ?"&&"
):
The shorter form performs elementwise comparisons ...
和:
The longer form evaluates left to right examining only the first element of each vector. Evaluation proceeds only until the result is determined. The longer form is appropriate for programming control-flow and typically preferred in if clauses.
示例:
foo <- function()
if (exists("x") && (x)) cat("is TRUE\n") else cat("not existing or FALSE\n")
x <- TRUE
foo()
x <- FALSE
foo()
rm(x)
foo()
可以在 this post 中找到更多内容。
案例。我有一部分代码是这样的:if (exists("mybooleanvar") & mybooleanvar) {statement1} else {statement2}
。我希望如果条件被延迟(短路)评估,如果 mybooleanvar
未分配,statement1
将是 运行,如果 mybooleanvar
将调用 statement2
] 不存在或等于 FALSE
。
但在实践中,我收到一个 运行 时间错误,表明 mybooleanvar
的值已被访问并与 TRUE
if exists("mybooleanvar") == FALSE
进行比较。所以完整的布尔值计算发生了。
当然,这个问题可以通过封闭的 if 语句来解决,外部语句评估 exists()
和内部语句 - 布尔值。但是我想知道,如果尽管有进一步语句的值,但结果是已知的,那么正确避免评估条件语句的第 n 个成员的最 Rly 方法是什么。
例如,如果 statement1 == FALSE
,statement1 & statement2
将是 FALSE
。 statement1 | statement2
是 TRUE
如果 statement1 == TRUE
和 statement2
不需要检查(或者至少可以通过编译器指令 {$B-)
in Delphi).
这里我会用&&
代替&
。它们在两个方面有所不同(参见 ?"&&"
):
The shorter form performs elementwise comparisons ...
和:
The longer form evaluates left to right examining only the first element of each vector. Evaluation proceeds only until the result is determined. The longer form is appropriate for programming control-flow and typically preferred in if clauses.
示例:
foo <- function()
if (exists("x") && (x)) cat("is TRUE\n") else cat("not existing or FALSE\n")
x <- TRUE
foo()
x <- FALSE
foo()
rm(x)
foo()
可以在 this post 中找到更多内容。