我们的变量是动态的吗?

drc*_*law 7 scope perl6 raku

即使$ var不是带有*twigil 的动态变量,此代码也会打印出“ Duo” :

our $var="Duo";
sub sub1() {
    say $*var;
}

sub1();
#output is 'Duo'
Run Code Online (Sandbox Code Playgroud)

unit package ABC;在开始处添加a 会导致编译时错误“找不到动态变量$ * var”:

unit package ABC;

our $var="Duo";
sub sub1() {
    say $*var;
}

sub1();
# compile time error
Run Code Online (Sandbox Code Playgroud)

在这种情况下,添加* twigil可使变量可访问。

为什么会有所不同?

编辑1:

无论使用或不使用软件包,使用my代替代替our都是编译时错误,即使按照我的理解,这意味着相同的词法范围。

是旨在动态使用,明确声明为这样的变量(就像我可以找到的所有示例一样)。如果是这样,如何our使以上工作?我糊涂了。

编辑2:

我认为以下内容说明了我为何感到困惑:

our $var="non dynamic";   #1
{say $*var;}

our $*var="dynamic";      #2
{say $*var;}


#With #2 commented output is
#non dynamic
#non dynamic
#
#With #2 in place output becomes
#(Any)
#dynamic
Run Code Online (Sandbox Code Playgroud)

在第一种情况下(注释#2),我动态地(两次)访问一个非动态变量。

在第二种情况下,our $var变量在our $*var声明时变得混乱,访问相同的动态变量将解析为两个单独的变量。

Håk*_*and 6

Seems like dynamic variables are looked up in the GLOBAL name space. Thus the following works:

unit package ABC;

$GLOBAL::var="Duo";
sub sub1() {
    say $*var;
}
sub1();
#output is 'Duo'
Run Code Online (Sandbox Code Playgroud)

The reason your first example works is that (according to the documentation):

The user's program starts in the GLOBAL package, so "our" declarations in the mainline code go into that package by default.

  • *“我们的 `$var` 是否也可以在没有显式命名空间的情况下从同一个包中直接访问?”* 是的,但它与动态变量 `我们的 $*var` 不是同一个变量。没有星号的 `our $var` 生成了一个词法变量,并通过使用完全限定的名称使 `$ABC::var` 可以从其他包访问。另一方面,`our $*var` 声明了一个动态变量(非词法变量);不能使用完全限定名称从其他包访问此变量。 (2认同)

Eli*_*sen 6

从概念上讲,动态变量查找发生在所有动态范围内。动态范围首先是PROCESS::,然后GLOBAL::是程序具有的任何动态范围。

因此,当您查找动态变量时,它将首先从当前向下查找所有动态范围。如果找不到它,它将在中查找GLOBAL::,如果找不到,则在中查找PROCESS::

例如,如果要在STDOUT上打印某些内容,它将查找$*OUT动态变量。如果您没有在动态范围中的某处定义一个,它将使用来自PROCESS::以下项的一个:

dd PROCESS::<$OUT>;
# IO::Handle element = IO::Handle.new(path => IO::Special.new("<STDOUT>")...)
Run Code Online (Sandbox Code Playgroud)

  • 我认为原因是`*`twigil表示一种查找方法,而不是一种类型。就个人而言,我认为这是一种疣,类似于A类{具有$ a = 42; 方法b(){$!a}}; dd A.new.b; #42`,您可以指定私有属性**,而不需要`!`标记。 (3认同)