2016-05-18 119 views
7

如何動態加載OO風格的模塊?Perl6:如何動態加載類模塊?

#!/usr/bin/env perl6 
use v6; 

my $r = prompt ':'; 

if $r { 
    require Text::CSV;   # Error: 
    my $csv = Text::CSV.new; # Could not find symbol '&CSV' 
} else { 
    require File::Temp <&tempfile>; 
    my ($filename , $filehandle) = tempfile; # this works 
} 

回答

9

如perl6 DOCO here解釋的,可以動態加載模塊但;

要導入你必須在編譯時定義它們的符號。

因此,else子句中的代碼因爲顯式請求導入<&tempfile>而起作用。

最接近的事,這是讓if子句中的代碼工作,我可以看到的是這個(其中大部分是從較早DOCO參考服用):

use v6.c ; 

sub load-a-module($name) { 
    require ::($name) ; 
    my $instance = ::($name).new() ; 
    return $instance ; 
} 

my $module = "Text::CSV" ; 
my $csv = load-a-module $module ; 
say $csv.WHAT ; 
# say $csv.^methods ; # if you really want to be convinced 

# outputs: (CSV)