2017-11-09 9 views
2

私は4つのファイルを持っています。Perl6:他のモジュールの中でモジュールを使用

  • C:\ perlCode2 start.pl6
  • C \:\ perlCode2 file0.pm6
  • C \:\ perlCode2 \ folder1のfile1.pm6
  • C \:\ perlCode2 \フォルダ2 \ 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内部、およびfile0内部FILE1 FILE2のインスタンスを作成します。この方法では、同じ出力を見るために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:ここ

は私が念頭に置いていた変化である

file0で
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; 
    } 
} 

、ライン 使用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] 

私は、ライン 使用libに」../folder2" ををfile1。 "file2"を使用します。 は動作しませんが、エラーは発生しません。

start.pl6:

use v6; 
use lib "."; 
use file0; 

say 'start'; 
my $file0 = file0.new(); 
say $file0.mystr; 
say 'end'; 

出力を生成するために最後に

[0.31sで仕上げ]、ファイルstart.pl6は次のようになります。私はちょうど出力を得ます出力:

start 
hello file 0 
file 0 
file 1 
file 2 
end 
+0

あなたは '使用libに「../folder2/file2.pm6'と '使用のlib "フォルダ2/file2.pl6" を交換しようとしたことがあり"(' file1.pm6'の中で)? –

+0

はい、奇妙なことに私はエラーを受け取りません。私は "[0.331で仕上げた]"を得る。 – Arimaafan

答えて

2

あなたがしようとしていることは私には意味がありません。これらのモジュールを任意にフォルダに入れているようです。


これらのモジュールの名前がここで意味をなすのであれば、どのように構造化するかです。

C:\perlCode2\start.pl6 
C:\perlCode2\lib\file0.pm6 
C:\perlCode2\lib\folder1\file1.pm6 
C:\perlCode2\lib\folder2\file2.pm6 

start.pl6:file0.pm6 \

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:

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 \フォルダ2 \ file2.pm6

class folder2::file2 is export { 
    has Str $.mystr = "file 2"; 
} 

+0

ありがとうございます!それは私が探していたものです:) – Arimaafan

1
use lib "folder2/file2.pl6"; 

これは、あなたがそれがないと思う何をしません。libは、ディレクトリを期待しています。Perlは、スクリプトのパスではなく、モジュールを探しているはずです。

あなたMy.pm6は、(現在の作業ディレクトリを基準に)./libであるならば、

use lib "lib"; 
use My; 

は、トリックを行います。絶対パスを使用することもできます

use lib "~/projects/perl6/MyProject/lib"; 
use My; 

libを参照してください。

+0

私のテストでは、どういう仕組みが見えていないのですか?エラーメッセージ 'use lib ... 'によれば、モジュール内でプレーンを使用することはできません。テストは次のように簡単です: 'mkdir lib;エコー "libを使用する 'lib';" > test.pm6; perl6 -I。 -Mestest -e "success"と答えてください。 – piojo

+1

"use lib"をモジュールに入れないで、モジュールを "使用する"スクリプトに入れます。 – Holli

+0

Gotcha。あなたがコードを書こうとしていた場所を誤解しました。モジュール名がわかりました。 – piojo

関連する問題