Perl6:在其他模块中使用模块
Perl6: use module inside other module
我有 4 个文件。
- C:\perlCode2\start.pl6
- C:\perlCode2\file0.pm6
- C:\perlCode2\folder1\file1.pm6
- C:\perlCode2\folder2\file2.pm6
start.pl6 用于运行我的程序。 3 个模块文件包含或生成最终由 start.pl6 使用的数据。我使用 atom.io 到 运行 代码。
代码如下:
start.pl6:
use v6;
use lib ".";
use file0;
use lib "folder1";
use file1;
use lib "folder2";
use file2;
say 'start';
my $file0 = file0.new();
say $file0.mystr;
my $file1 = file1.new();
say $file1.mystr;
my $file2 = file2.new();
say $file2.mystr;
say 'end';
file0.pm6:
class file0 is export {
has Str $.mystr = "file 0";
submethod BUILD() {
say "hello file 0";
}
}
file1.pm6:
class file1 is export {
has Str $.mystr = "file 1";
}
file2.pm6:
class file2 is export {
has Str $.mystr = "file 2";
}
输出:
start
hello file 0
file 0
file 1
file 2
end
[Finished in 0.51s]
我不想在 start.pl6 中创建所有 3 个模块文件的实例,而是想在 file1 中创建 file2 的实例,在 file0 中创建 file1 的实例。这样我只需要在 start.pl6 中创建一个 file0 的实例就可以看到相同的输出;
以下是我想到的更改:
file1.pm6:
use lib "../folder2";
use "file2.pl6";
class file1 is export {
has Str $.mystr = "file 1";
submethod BUILD() {
my $file2 = file2.new();
$!mystr = $!mystr ~ "\n" ~ $file2.mystr;
# I want to instantiate file2 inside the constructor,
# so I can be sure the line
# $!mystr = $!mystr ~ "\n" ~ $file2.mystr;
# takes effect before i call any of file0's methods;
}
}
file0.pm6:
use lib "folder1";
use "file1.pl6";
class file0 is export {
has Str $.mystr = "file 0";
submethod BUILD() {
say "hello file 0";
my $file1 = file1.new();
$!mystr = $!mystr ~ "\n" ~ $file1.mystr;
}
}
在文件 0 中,行
使用库"folder1";
使用 "file1.pl6";
产生此错误:
===SORRY!=== Error while compiling C:\perlCode2\file0.pm6 (file0)
'use lib' may not be pre-compiled
at C:\perlCode2\file0.pm6 (file0):2
------> use lib "folder1/file1.pl6"<HERE>;
[Finished in 0.584s]
我是file1,行
使用库“../folder2”;
使用 "file2";
不起作用,但也没有给出错误。我刚得到输出:
[在 0.31 秒内完成]
最后,文件 start.pl6 应如下所示以产生输出:
start.pl6:
use v6;
use lib ".";
use file0;
say 'start';
my $file0 = file0.new();
say $file0.mystr;
say 'end';
输出:
start
hello file 0
file 0
file 1
file 2
end
use lib "folder2/file2.pl6";
这与您认为的不同。 use lib 需要一个 directory Perl 应该在其中寻找模块,而不是某些脚本的路径。
如果你的 My.pm6 在 ./lib 中(相对于当前工作目录)那么
use lib "lib";
use My;
成功了。也可以使用绝对路径
use lib "~/projects/perl6/MyProject/lib";
use My;
见lib。
你试图做的对我来说毫无意义。看来你把那些模块任意放在文件夹里了。
如果这些模块的名称确实有意义,我可能会这样构建它。
C:\perlCode2\start.pl6
C:\perlCode2\lib\file0.pm6
C:\perlCode2\lib\folder1\file1.pm6
C:\perlCode2\lib\folder2\file2.pm6
start.pl6:
use v6;
END say "[Finished in {(now - $*INIT-INSTANT).fmt("%0.2fs")}";
use lib 'lib';
use file0;
say 'start';
my $file0 = file0.new;
say $file0.mystr;
say 'end';
lib\file0.pm6:
use folder1::file1;
class file0 is export {
has Str $.mystr = "file 0";
submethod TWEAK() {
say "hello file 0";
$!mystr ~= "\n" ~ folder1::file1.new.mystr;
}
}
lib\folder1\file1.pm6:
use folder2::file2;
class folder1::file1 is export {
has Str $.mystr = "file 1";
submethod TWEAK() {
$!mystr ~= "\n" ~ folder2::file2.new.mystr;
}
}
lib\folder2\file2.pm6
class folder2::file2 is export {
has Str $.mystr = "file 2";
}
我有 4 个文件。
- C:\perlCode2\start.pl6
- C:\perlCode2\file0.pm6
- C:\perlCode2\folder1\file1.pm6
- C:\perlCode2\folder2\file2.pm6
start.pl6 用于运行我的程序。 3 个模块文件包含或生成最终由 start.pl6 使用的数据。我使用 atom.io 到 运行 代码。
代码如下:
start.pl6:
use v6;
use lib ".";
use file0;
use lib "folder1";
use file1;
use lib "folder2";
use file2;
say 'start';
my $file0 = file0.new();
say $file0.mystr;
my $file1 = file1.new();
say $file1.mystr;
my $file2 = file2.new();
say $file2.mystr;
say 'end';
file0.pm6:
class file0 is export {
has Str $.mystr = "file 0";
submethod BUILD() {
say "hello file 0";
}
}
file1.pm6:
class file1 is export {
has Str $.mystr = "file 1";
}
file2.pm6:
class file2 is export {
has Str $.mystr = "file 2";
}
输出:
start
hello file 0
file 0
file 1
file 2
end
[Finished in 0.51s]
我不想在 start.pl6 中创建所有 3 个模块文件的实例,而是想在 file1 中创建 file2 的实例,在 file0 中创建 file1 的实例。这样我只需要在 start.pl6 中创建一个 file0 的实例就可以看到相同的输出;
以下是我想到的更改:
file1.pm6:
use lib "../folder2";
use "file2.pl6";
class file1 is export {
has Str $.mystr = "file 1";
submethod BUILD() {
my $file2 = file2.new();
$!mystr = $!mystr ~ "\n" ~ $file2.mystr;
# I want to instantiate file2 inside the constructor,
# so I can be sure the line
# $!mystr = $!mystr ~ "\n" ~ $file2.mystr;
# takes effect before i call any of file0's methods;
}
}
file0.pm6:
use lib "folder1";
use "file1.pl6";
class file0 is export {
has Str $.mystr = "file 0";
submethod BUILD() {
say "hello file 0";
my $file1 = file1.new();
$!mystr = $!mystr ~ "\n" ~ $file1.mystr;
}
}
在文件 0 中,行 使用库"folder1"; 使用 "file1.pl6"; 产生此错误:
===SORRY!=== Error while compiling C:\perlCode2\file0.pm6 (file0)
'use lib' may not be pre-compiled
at C:\perlCode2\file0.pm6 (file0):2
------> use lib "folder1/file1.pl6"<HERE>;
[Finished in 0.584s]
我是file1,行 使用库“../folder2”; 使用 "file2"; 不起作用,但也没有给出错误。我刚得到输出: [在 0.31 秒内完成]
最后,文件 start.pl6 应如下所示以产生输出:
start.pl6:
use v6;
use lib ".";
use file0;
say 'start';
my $file0 = file0.new();
say $file0.mystr;
say 'end';
输出:
start
hello file 0
file 0
file 1
file 2
end
use lib "folder2/file2.pl6";
这与您认为的不同。 use lib 需要一个 directory Perl 应该在其中寻找模块,而不是某些脚本的路径。
如果你的 My.pm6 在 ./lib 中(相对于当前工作目录)那么
use lib "lib";
use My;
成功了。也可以使用绝对路径
use lib "~/projects/perl6/MyProject/lib";
use My;
见lib。
你试图做的对我来说毫无意义。看来你把那些模块任意放在文件夹里了。
如果这些模块的名称确实有意义,我可能会这样构建它。
C:\perlCode2\start.pl6
C:\perlCode2\lib\file0.pm6
C:\perlCode2\lib\folder1\file1.pm6
C:\perlCode2\lib\folder2\file2.pm6
start.pl6:
use v6;
END say "[Finished in {(now - $*INIT-INSTANT).fmt("%0.2fs")}";
use lib 'lib';
use file0;
say 'start';
my $file0 = file0.new;
say $file0.mystr;
say 'end';
lib\file0.pm6:
use folder1::file1;
class file0 is export {
has Str $.mystr = "file 0";
submethod TWEAK() {
say "hello file 0";
$!mystr ~= "\n" ~ folder1::file1.new.mystr;
}
}
lib\folder1\file1.pm6:
use folder2::file2;
class folder1::file1 is export {
has Str $.mystr = "file 1";
submethod TWEAK() {
$!mystr ~= "\n" ~ folder2::file2.new.mystr;
}
}
lib\folder2\file2.pm6
class folder2::file2 is export {
has Str $.mystr = "file 2";
}