2016-05-18 147 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)