gpt4 book ai didi

mouseevent - Perl6 : NCurses and mouse events

转载 作者:行者123 更新时间:2023-12-03 23:54:22 25 4
gpt4 key购买 nike

我没有成功从 getmouse 返回鼠标事件。我的代码有错误吗?

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

my $win = initscr;
raw();
keypad( $win, True );
my Array[int32] $old;
mousemask( ALL_MOUSE_EVENTS +| REPORT_MOUSE_POSITION, $old ) or die;

loop {
my $key = getch();
if $key == KEY_MOUSE {
my NCurses::MEVENT $event;
my $ok = getmouse( $event );
endwin;
say "ok: ", $ok.perl; # -1
say "event: ", $event.perl; # NCurses::MEVENT
exit;
}
}

NCurses

最佳答案

惯用语

如果您必须将类型的名称写为变量声明的一部分,您不妨将其写为变量的类型约束并使用 .= new 而不是使用 Marty 或您的解决方案:

my NCurses::MEVENT $event .= new

马蒂的解决方案:

my $event = NCurses::MEVENT.new

之所以有效,是因为 $event 现在包含 getevent($event) 调用需要它包含的内容,即新的 NCurses::MEVENT 对象。但它放弃了添加类型检查的简单机会。

您的解决方案:

my NCurses::MEVENT $event = NCurses::MEVENT.new

的意思与这种情况下的常用习语相同,但不是 DRY .

出了什么问题

line of code that glues the Perl 6 getmouse call to the underlying native NCurses library开始:

sub getmouse(MEVENT) ...

这告诉 Perl 6 getmouse 需要一个 NCurses::MEVENT 类型的参数。

马蒂的解决方案奏效了。他们没有告诉 Perl 6 $event 应该包含什么类型的值。但他们无论如何都会在其中放入正确的值,因此缺少类型检查并不重要。

您的原始解决方案启用了有用的类型检查。它告诉 Perl 6 确保 $event 只包含 NCurses::MEVENT 类型的对象。不幸的是你没有显式初始化变量所以它包含......

等一下。它包含什么? Perl 6 不应该确保 $event 中有一个 NCurses::MEVENT 对象吗?

原来如此!但是 Perl 6 并没有放置一个普通新的 NCurses::MEVENT 对象,而是放置了一个旧的 NCurses::MEVENT type 对象在那里作为占位符。除其他事项外,Type 对象表示未初始化对象的概念。 (有点像 Perl 5 中的“undef”。)

此机制通常适用于显示错误,例如忘记适本地初始化变量。但在这种情况下不是。那到底出了什么问题?

回到 getmouse 声明。应该是:

sub getmouse(MEVENT:D) ...

:D “type smiley” 会告诉 Perl 6 参数必须被定义,即一个未初始化 NCurses::MEVENT 不够好。有了这个笑脸,你就会得到一个适当的错误,而不是沉默。

关于mouseevent - Perl6 : NCurses and mouse events,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35510638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com