【发布时间】:2019-02-04 16:15:23
【问题描述】:
我正在制作一个包,我必须在 sub 中通过其名称获取符号的值,而该符号是在 sub 之外定义的。
这是简化的代码,它按预期工作:
#! /usr/bin/env perl6
sub dump_value($symbol) {
say ::("$symbol")
}
# usage:
my $x = 10;
dump_value('$x');
# expected output: 10
# actual output: 10
然后我将“dump_value”放在一个独立文件中,如下所示:
# somelib.pm6
unit module somelib;
sub dump_value($symbol) is export {
say ::("$symbol")
}
# client.pl6
#! /usr/bin/env perl6
use lib ".";
use somelib;
my $x = 10;
dump_value('$x');
编译器抱怨:
No such symbol '$x'
in sub dump_value at xxx/somelib.pm6 (somelib) line 3
in block <unit> at ./client.pl6 line 8
以下是一些实验。他们都没有成功。
say ::("MY::$symbol")
say ::("OUR::$symbol")
say ::("OUTER::$symbol")
say ::("CLIENT::$symbol")
...
那么如何修复代码呢?
更新:
谢谢! CALLERS::($symbol) 解决了我原来的问题。但在稍微复杂一点的情况下,编译器再次抱怨:
# somelib.pm6
unit module somelib;
sub dump_value(@symbols) is export {
# output: 6
say CALLERS::('$x');
# error: No such symbol 'CALLERS::$x'
say @symbols.map({ CALLERS::($^id) } )
}
# client.pl6
#! /usr/bin/env perl6
use lib ".";
use somelib;
my $x = 6;
my $y = 8;
dump_value(<$x $y>);
再次更新:
使用OUTER::CALLERS::($^id)。
一次又一次更新:
在我将“dump_value”放入另一个 sub 之后,它不再起作用了!
# somelib.pm6
unit module somelib;
sub dump_value(@symbols) is export {
say @symbols.map({ OUTER::CALLERS::($^id) } )
}
sub wrapped_dump_value(@symbols) is export {
dump_value(@symbols)
}
#! /usr/bin/env perl6
use lib ".";
use somelib;
my $x = 6;
my $y = 8;
# ouput: (6 8)
dump_value(<$x $y>);
# error: No such symbol 'OUTER::CALLERS::$x'
wrapped_dump_value(<$x $y>);
【问题讨论】:
-
以下对我有用:
say CALLER::MY::($symbol)
标签: scope raku string-interpolation symbol-table