Language agnostic 什么是简单的一次完成技术?
无论函数执行多少次,只执行一次操作的简单技术是什么?有没有任何编程语言内置了特定的方法来处理这个比较常见的问题 示例:initialize()应仅在第一次执行时将全局_变量设置为trueLanguage agnostic 什么是简单的一次完成技术?,language-agnostic,Language Agnostic,无论函数执行多少次,只执行一次操作的简单技术是什么?有没有任何编程语言内置了特定的方法来处理这个比较常见的问题 示例:initialize()应仅在第一次执行时将全局_变量设置为true 一个C++示例(寻找好奇心的替代品——不是必需的): 初始h: int global_variable; void initialize(void); 初始c: static bool already_initialized = false; void initialize(void) { if (!
一个C++示例(寻找好奇心的替代品——不是必需的):
初始h:int global_variable;
void initialize(void);
初始c:
static bool already_initialized = false;
void initialize(void)
{
if (!already_initialized)
{
already_initialized = true;
global_variable = true;
}
}
是的,一些语言(scala)确实支持它(使用lazy),但通常这个功能是由框架提供的,因为有一些折衷。有时您需要线程级别的阻塞同步。有时附带利益就足够了。有时您不需要同步,因为简单的单线程缓存就足够了。有时,您需要记住许多计算值,并且愿意忘记最近使用的值。等等可能这就是语言通常不支持这种模式的原因——这是框架的工作是的,一些语言(scala)确实支持它(使用惰性),但通常这种功能是由框架提供的,因为有一些折衷。有时您需要线程级别的阻塞同步。有时附带利益就足够了。有时您不需要同步,因为简单的单线程缓存就足够了。有时,您需要记住许多计算值,并且愿意忘记最近使用的值。等等可能这就是语言通常不支持这种模式的原因——这是框架的工作是的,一些语言(scala)确实支持它(使用惰性),但通常这种功能是由框架提供的,因为有一些折衷。有时您需要线程级别的阻塞同步。有时附带利益就足够了。有时您不需要同步,因为简单的单线程缓存就足够了。有时,您需要记住许多计算值,并且愿意忘记最近使用的值。等等可能这就是语言通常不支持这种模式的原因——这是框架的工作是的,一些语言(scala)确实支持它(使用惰性),但通常这种功能是由框架提供的,因为有一些折衷。有时您需要线程级别的阻塞同步。有时附带利益就足够了。有时您不需要同步,因为简单的单线程缓存就足够了。有时,您需要记住许多计算值,并且愿意忘记最近使用的值。等等也许这就是语言通常不支持这种模式的原因——这是框架的工作除了任何语言都可以使用的全局变量技术之外,还有其他几种方法可以做到这一点 在具有静态变量的语言中,为了防止全局范围内的变量名冲突,最好使用静态变量而不是全局变量 在某些语言中,您可以在运行时重新定义/重新声明函数,以便执行以下操作:
function initialize (void) {
// do some stuff...
function initialize(void) {}; // redefine function here to do nothing
}
function initialize (void) {
// do some stuff ...
initialize = function (void) {}; // assign no-op anonymous function
// to this function
}
function do_once initialize (void) {
// do some stuff
}
在某些语言中,由于作用域问题(内部函数),无法在函数中重新声明函数,但仍可以将其他函数重新分配给现有函数。所以你可以这样做:
function initialize (void) {
// do some stuff...
function initialize(void) {}; // redefine function here to do nothing
}
function initialize (void) {
// do some stuff ...
initialize = function (void) {}; // assign no-op anonymous function
// to this function
}
function do_once initialize (void) {
// do some stuff
}
有些语言(特别是声明性语言)实际上内置了一个“闩锁”功能,只执行一次。有时甚至还有重置功能。所以你可以这样做:
function initialize (void) {
// do some stuff...
function initialize(void) {}; // redefine function here to do nothing
}
function initialize (void) {
// do some stuff ...
initialize = function (void) {}; // assign no-op anonymous function
// to this function
}
function do_once initialize (void) {
// do some stuff
}
如果语言允许,如果确实要重新执行该功能,可以重置do_once
指令:
reset initialize;
initialize();
注意:上面类似C的语法显然是伪代码,并不代表任何真实语言,但所描述的特性确实存在于真实语言中。此外,除了HTML、XML和CSS之外,程序员很少遇到声明性语言,但图灵完整的声明性语言确实存在,通常用于硬件设计和“do_once”该功能通常编译为D触发器或锁存器。除了在任何语言中都可以使用的全局变量技术外,还有其他几种方法可以做到这一点 在具有静态变量的语言中,为了防止全局范围内的变量名冲突,最好使用静态变量而不是全局变量 在某些语言中,您可以在运行时重新定义/重新声明函数,以便执行以下操作:
function initialize (void) {
// do some stuff...
function initialize(void) {}; // redefine function here to do nothing
}
function initialize (void) {
// do some stuff ...
initialize = function (void) {}; // assign no-op anonymous function
// to this function
}
function do_once initialize (void) {
// do some stuff
}
在某些语言中,由于作用域问题(内部函数),无法在函数中重新声明函数,但仍可以将其他函数重新分配给现有函数。所以你可以这样做:
function initialize (void) {
// do some stuff...
function initialize(void) {}; // redefine function here to do nothing
}
function initialize (void) {
// do some stuff ...
initialize = function (void) {}; // assign no-op anonymous function
// to this function
}
function do_once initialize (void) {
// do some stuff
}
有些语言(特别是声明性语言)实际上内置了一个“闩锁”功能,只执行一次。有时甚至还有重置功能。所以你可以这样做:
function initialize (void) {
// do some stuff...
function initialize(void) {}; // redefine function here to do nothing
}
function initialize (void) {
// do some stuff ...
initialize = function (void) {}; // assign no-op anonymous function
// to this function
}
function do_once initialize (void) {
// do some stuff
}
如果语言允许,如果确实要重新执行该功能,可以重置do_once
指令:
reset initialize;
initialize();
注意:上面类似C的语法显然是伪代码,并不代表任何真实语言,但所描述的特性确实存在于真实语言中。此外,除了HTML、XML和CSS之外,程序员很少遇到声明性语言,但图灵完整的声明性语言确实存在,通常用于硬件设计和“do_once”该功能通常编译为D触发器或锁存器。除了在任何语言中都可以使用的全局变量技术外,还有其他几种方法可以做到这一点 在具有静态变量的语言中,为了防止全局范围内的变量名冲突,最好使用静态变量而不是全局变量 在某些语言中,您可以在运行时重新定义/重新声明函数,以便执行以下操作:
function initialize (void) {
// do some stuff...
function initialize(void) {}; // redefine function here to do nothing
}
function initialize (void) {
// do some stuff ...
initialize = function (void) {}; // assign no-op anonymous function
// to this function
}
function do_once initialize (void) {
// do some stuff
}
在某些语言中,由于作用域问题(内部函数),无法在函数中重新声明函数,但仍可以将其他函数重新分配给现有函数。所以你可以做som