- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Perl 5.18.2 似乎接受“本地子程序”。
例子:
sub outer()
{
my $x = 'x'; # just to make a simple example
sub inner($)
{
print "${x}$_[0]\n";
}
inner('foo');
}
如果没有“本地子程序”,我会这样写:
#...
my $inner = sub ($) {
print "${x}$_[0]\n";
}
$inner->('foo');
#...
最重要的是,我认为两者是等价的。
然而,第一个变体并没有像 Perl 提示的那样工作:
Variable $x is not available at ...
其中 ...
描述了 $x
在“本地子程序”中引用的行。
谁能解释一下; Perl 的本地子程序与 Pascal 的本地子程序有根本的不同吗?
最佳答案
问题中的术语“本地子程序”似乎指的是lexical subroutines .这些是私有(private)子程序,仅在定义它们的范围( block )内可见,在定义之后;就像私有(private)变量一样。
但它们是用my
或state
定义(或预先声明)的,如my sub subname { ... }
只是在另一个里面写一个 sub subname { ... }
并不能使它成为“本地”(在任何版本的 Perl 中),但它被编译就像它是一起写的一样其他子例程并放置在它们包的符号表中(例如 main::
)。
问题提到 closure在标题中,这是对此的评论
A closure in Perl是程序中的一个结构,通常是一个标量变量,具有对子的引用,并且在其(运行时)创建时从其范围携带环境(变量)。另见 perlfaq7 entry在上面。乱解释。例如:
sub gen {
my $args = "@_";
my $cr = sub { say "Closed over: $args, my args: @_" }
return $cr;
}
my $f = gen( qw(args for gen) );
$f->("hi closed");
# Prints:
# Closed over: args for gen, my args: hi closed
匿名子“关闭”了定义它的范围内的变量,从某种意义上说,当它的生成函数返回其引用并超出范围时,由于该引用的存在,这些变量仍然存在。由于匿名 sub 是在运行时创建的,因此每次调用其生成函数并重新创建其中的词法时,anon sub 也是如此,因此它始终可以访问当前值。因此,返回的对 anon-sub 的引用使用词法数据,否则这些数据将消失。一点魔法。†
回到“本地”潜艇的问题。如果我们想对问题引入实际的闭包,我们需要从 outer
子例程返回一个代码引用,比如
sub outer {
my $x = 'x' . "@_";
return sub { say "$x @_" }
}
my $f = outer("args");
$f->( qw(code ref) ); # prints: xargs code ref
或者,根据主要问题,如 v5.18.0 中所述从 v5.26.0 稳定,我们可以使用命名的词法(真正嵌套!)子例程
sub outer {
my $x = 'x' . "@_";
my sub inner { say "$x @_" };
return \&inner;
}
在这两种情况下,my $f = outer(...);
都有从 outer
返回的代码引用,它正确地使用了局部词法变量 ($ x
),以及它们的最新值。
但是我们不能在 outer
内部使用普通命名的 sub 作为闭包
sub outer {
...
sub inner { ... } # misleading, likely misguided and buggy
return \&inner; # won't work correctly
}
这个 inner
是在编译时创建的,并且是全局的,因此它从 outer
使用的任何变量都将从 outer
被烘焙时得到它们的值第一次打电话。所以 inner
只有在 outer
被下一次调用时才是正确的——当 outer
中的词法环境被重新创建但 inner
没有。例如,我可以很容易地找到 this post , 并查看条目 in perldiag (或将 use diagnostics;
添加到程序中)。
† 在我看来,在某种程度上,这是一个穷人的对象,因为它具有功能和数据,是在其他时间在其他地方制作的,并且可以与传递给它的数据一起使用(两者都可以待更新)
关于perl - 闭包中的局部变量可见性与局部 `sub` s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72656597/
如果我们定义一个像这样的函数 (defun foo(x) (setf x somevalue)) x 定义为局部变量还是全局变量?使用 setf/q 将值设置为全局值。如果它是全局的,谁能告诉我如
仍在学习 MVC3、EF。现在我正在连接到 MySql,但我相信这无关紧要。为简单起见,我决定为我的测试应用程序使用一个数据库,并且我包含了一个类别来区分数据。例如,我有一个新闻、事件、信息和页面类别
假设我定义了以下代码: int *func() { int *p=(int *)malloc(sizeof(int)); // memory is allocated from heap
我正在构建一个小型 PHP MVC,但我在一小部分编码方面碰壁了。我想我需要“局部 View ”,但我也许可以用现有代码实现一些东西。 目前我的 Controller 是最简单的形式: 实例化一个对象
假设我定义了以下代码: int *func() { int *p=(int *)malloc(sizeof(int)); // memory is allocated from heap
我有以下代码(用 Python 2.X 编写): def banana(x): def apple(stuff): x /= 10 return stuff -
我正在尝试重用一些代码,部分 View 似乎是使用 MVC 时执行此操作的最佳方式。 我创建了一个继承自 IEnumerable 的局部 View (见下文)。 @model IEnumerable
局部 const 变量将存储在哪里?我已经验证过,函数中使用 const 变量的每个位置都会被其值替换(如立即值寻址模式)。但如果指针被分配给它,那么它就会存储在堆栈中。在这里我不明白处理器如何知道其
我想将局部变量用作全局变量,有人告诉我这样做的方法是在函数外部创建变量,如下所示: var foo = null; function bar() {
我正在处理一个很长的 Angular 表格。我想知道我是否可以将它分成许多不同的 View 并在主视图中引用它们中的每一个。 First Section
我有一个导航栏,它是一个局部 View ,我需要在设计页面上呈现它,以便用户编辑他们的个人资料。事实上,我只有一个页面,但是添加执行帐户维护的路径搞乱了我的导航栏加载,因为实例变量不存在。无论如何,我
我没有用到全局变量,也从未明确定义过全局变量,但我的代码中似乎有一个。你能帮我把它做成本地的吗? def algo(X): # randomized algorithm while len(X
假设我有这个(当前无返回)函数: def codepoint_convert(text, offset): codepoint = text[offset] if codepoint
我在我的项目中同时使用了局部 View 和布局概念,但我无法区分。但我的感觉是两者都在做同样的工作。任何人都可以通过示例说出有关局部 View 和布局的简要概念以及区别吗? 最佳答案 除了 Josh
使用全局变量会加快速度吗?在英特尔的体系结构软件开发人员手册(关于微处理器)中建议使用局部变量而不是全局变量。但是,请考虑以下代码: void process_tcp_packets(void) {
我有一个局部 View 使用的模型与我在其中呈现它的 View 不同。我不断收到错误消息。 The model item passed into the dictionary is of type '
我在 cshtml 页面上有一个局部 View ,如下所示:- @model MvcCommons.ViewModels.CompositeViewModel @{ ViewBag.Title = "
我在从 while 循环全局更新数组时遇到问题,如下所述。请注意,我只能使用 C 95 及之前版本的功能。任何帮助将不胜感激!满浆箱http://pastebin.com/ss6VgTCD 在我的程序
我想刷新 Json 局部 View 。我正在尝试使用这个: $('#example123').load('@Url.Action("Rejestracja", "Logowanie")'); 但不能正
我有一个 asp.net 页面,它返回我当前正在使用的选项卡中的部分 View 。我已经设置了所有 jQuery 并且可以正常工作。它工作一次并通过 ajax 返回一个局部 View .html(re
我是一名优秀的程序员,十分优秀!