我最近发现gcc允许定义嵌套函数.在我看来,这是一个很酷的功能,但我想知道如何实现它.
虽然通过将上下文指针作为隐藏参数传递来实现嵌套函数的直接调用当然不难,但gcc还允许获取指向嵌套函数的指针并将此指针传递给任意其他函数,而该函数又可以调用嵌套函数上下文的功能.因为调用嵌套函数的函数只有要调用的嵌套函数的类型,所以它显然无法传递上下文指针.
我知道,其他语言如Haskell有一个更复杂的调用约定允许部分应用程序支持这些东西,但我认为没有办法在C中这样做.如何实现这一点?
以下是一个说明问题的案例的小例子:
int foo(int x,int(*f)(int,int(*)(void))) {
int counter = 0;
int g(void) { return counter++; }
return f(x,g);
}
Run Code Online (Sandbox Code Playgroud)
此函数调用一个函数,该函数调用一个函数,该函数从上下文返回一个计数器并同时递增它.
我知道嵌套函数不是标准C的一部分,但由于它们存在于gcc中(并且事实上gcc是我唯一关心的编译器),我倾向于经常使用它们.
这是坏事吗 ?如果是这样,你能告诉我一些令人讨厌的例子吗?gcc中嵌套函数的状态是什么?他们会被删除吗?
有了闭包,我通常将[弱自我]附加到我的捕获列表上,然后对self进行空检查:
func myInstanceMethod()
{
let myClosure =
{
[weak self] (result : Bool) in
if let this = self
{
this.anotherInstanceMethod()
}
}
functionExpectingClosure(myClosure)
}
Run Code Online (Sandbox Code Playgroud)
如果我使用嵌套函数代替闭包,我该如何对self执行null检查(或者检查甚至是必要的......或者使用像这样的嵌套函数甚至是好的做法)即
func myInstanceMethod()
{
func nestedFunction(result : Bool)
{
anotherInstanceMethod()
}
functionExpectingClosure(nestedFunction)
}
Run Code Online (Sandbox Code Playgroud) memory-management weak-references nested-function swift capture-list
我想在嵌套函数中定义变量,以便在嵌套函数中进行更改,例如
def nesting():
count = 0
def nested():
count += 1
for i in range(10):
nested()
print count
Run Code Online (Sandbox Code Playgroud)
当调用嵌套函数时,我希望它打印10,但它会引发UnboundLocalError.全球关键词可以解决这个问题.但由于变量计数仅用于嵌套函数的范围,我希望不要将其声明为全局变量.这样做的好方法是什么?
例如,
public int DoSomething(in SomeType something){
int local(){
return something.anInt;
}
return local();
}
Run Code Online (Sandbox Code Playgroud)
为什么编译器会发出无法在局部函数中使用 some 变量的错误?
在下面的例子中,您将如何对嵌套函数f1()进行单元测试?
def f():
def f1():
return 1
return 2
Run Code Online (Sandbox Code Playgroud)
或者需要测试的函数是否应该嵌套?
我正在尝试设置一个函数来重新格式化一个稍后将被连接的字符串.示例字符串如下所示:
Standard_H2_W1_Launch_123x456_S_40K_AB
Run Code Online (Sandbox Code Playgroud)
虽然有时" S "不存在,有时"40K"是"60K"或不存在,"_ AB"也可以是"_CD"或_"EF".最后,所有下划线都需要更改为连字符.最终产品应如下所示:
Standard-H2-W1-Launch-123x456-
Run Code Online (Sandbox Code Playgroud)
我有四个函数,如果一个接一个地运行将负责所有这些:
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A2,"_AB","_"),"_CD","_"),"_EF","_")
=SUBSTITUTE(SUBSTITUTE(B2,"_40K",""),"_60K","")
=SUBSTITUTE(C2,"_S_","_")
=SUBSTITUTE(D2,"_","-")
Run Code Online (Sandbox Code Playgroud)
我已经尝试了将这些组合成一个函数的多种方法,但我对这个级别的excel相对较新,所以我很茫然.无论如何要将所有这些结合起来,以便它在一个单元格中执行另一个命令吗?
我试图理解,python中的变量绑定是如何工作的.我们来看看这个:
def foo(x):
def bar():
print y
return bar
y = 5
bar = foo(2)
bar()
Run Code Online (Sandbox Code Playgroud)
这打印5对我来说似乎是合理的.
def foo(x):
def bar():
print x
return bar
x = 5
bar = foo(2)
bar()
Run Code Online (Sandbox Code Playgroud)
打印2,这很奇怪.在第一个示例中,python在执行期间查找变量,在第二个示例中查找方法.为什么会这样?
要清楚:这非常酷,并且完全按照我的意愿工作.但是,我对内部条形函数如何获取其上下文感到困惑.我想明白,引擎盖下会发生什么.
编辑
我知道,局部变量具有更高的优先级.我很好奇,python在执行过程中如何知道从我之前调用的函数中获取参数.bar已创建foo并且x不再存在.它x在创建函数时将其绑定到参数值?
一些同事说嵌套功能对性能不利,我想问一下这个问题.
让我们说我有这个功能:
function calculateStuff() {
function helper() {
// helper does things
}
// calculateStuff does things
helper();
}
Run Code Online (Sandbox Code Playgroud)
helper是一个私有函数,仅在calculateStuff中使用.这就是我想在calculateStuff中封装它的原因.
这比表现更糟糕吗?
function helper() {
}
function calculateStuff() {
helper();
}
Run Code Online (Sandbox Code Playgroud)
请注意,在第二种情况下,我将助手暴露给我的范围.
nested-function ×10
python ×4
c ×2
closures ×2
gcc ×2
c# ×1
c#-7.0 ×1
capture-list ×1
cython ×1
excel ×1
javascript ×1
nested ×1
performance ×1
ref ×1
substitution ×1
swift ×1
unit-testing ×1