我有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;
      }
    }
    

    在file0中,各行
    使用lib“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,行
    使用lib“../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
    

    最佳答案

    你想做什么对我来说毫无意义。看来您是将这些模块任意放置在文件夹中。

    如果这些模块的名称确实有意义,那么这里就是我的结构方式。

    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";
    }
    

    10-06 14:37