【问题标题】:require Readline - You cannot create an instance of this type (Readline) [duplicate]需要 Readline - 您不能创建这种类型的实例(Readline)[重复]
【发布时间】:2021-05-10 05:21:56
【问题描述】:

当我运行这段代码时

require Readline;
my $rl = Readline.new;
my $string = $rl.readline( ':');
$string.say;

我收到此错误消息:

您不能创建这种类型的实例(Readline)

当我使用 use 加载 Readline 时,它可以工作。为什么require Readline 不起作用?

【问题讨论】:

标签: require readline raku


【解决方案1】:

由于require 导致模块在运行时加载,Readline 符号的查找也必须推迟到运行时。这可以使用::('Type::Name') 语法来完成,如下所示:

require Readline;
my $rl = ::('Readline').new;
my $string = $rl.readline( ':');
$string.say;

【讨论】:

  • 可以恢复到通常的语法,并避免重复运行时查找代码,通过一个术语间接,如下所示:require Readline; sub term:<Readline> { ::('Readline') }; my $rl = Readline.new;
  • 不,感觉就像是 hack;最好将其跟踪为希望编译器生成后期绑定查找的名称。如果是多部分名称怎么办?
  • 哦。 :) 谢谢。对于后来的读者:我已经测试过创建一个多部分术语——sub term:<foo::bar>——并且它可以引用foo 包中的bar。但我没有使用单部分术语进行测试——sub term:<foo>——然后尝试使用foo::barfoo 包中引用相同的bar,这反而会产生运行时错误。我已经删除了我的评论,询问 jnthn 是否认为让编译器执行术语技巧是否有意义。我留下了我最初的评论,以及我对他的支持,作为提示,然后对后来的读者发出警告。
猜你喜欢
  • 1970-01-01
  • 2021-11-21
  • 2018-10-28
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
相关资源
最近更新 更多