加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl6 – 方法级联语法

发布时间:2020-12-15 21:43:40 所属栏目:大数据 来源:网络整理
导读:Dart和Smalltalk有 method cascades. 似乎可以通过这样做来实现类似的风格. 例如,这是一个使用 GTK::Simple 的简单程序: use v6;use GTK::Simple;my $app = GTK::Simple::App.new(title = "abc");$app.set-content( GTK::Simple::VBox.new( my $button_a =
Dart和Smalltalk有 method cascades.

似乎可以通过这样做来实现类似的风格.

例如,这是一个使用GTK::Simple的简单程序:

use v6;

use GTK::Simple;

my $app = GTK::Simple::App.new(title => "abc");

$app.set-content(
    GTK::Simple::VBox.new(
        my $button_a = GTK::Simple::Button.new(label => 'bcd'),my $button_b = GTK::Simple::Button.new(label => 'cde')
    )
);

$app.border-width = 20;

$button_a.clicked.tap({ .sensitive = False; $button_b.sensitive = True });

$button_b.sensitive = False;

$button_b.clicked.tap({ $app.exit });

$app.run;

这是在一些地方使用do的等效程序来实现类似于方法级联的效果:

use v6;

use GTK::Simple;

my $app;
my $button_a;
my $button_b;

do with GTK::Simple::App.new(title => 'abc')
{
    $app = $_;

    .set-content(
        GTK::Simple::VBox.new(
            $button_a = do with GTK::Simple::Button.new(label => 'bcd')
            {
                .clicked.tap({ .sensitive = False; $button_b.sensitive = True });
                $_
            },$button_b = do with GTK::Simple::Button.new(label => 'cde')
            {
                .sensitive = False;
                .clicked.tap({ $app.exit });
                $_
            }
        )
    );

    .border-width = 20;
    .run;
};

我的问题是,在Perl 6中表达方法级联风格是否有更惯用的方法?

一个缺点是你必须明确地返回$_.使用传统方法级联,隐式返回原始接收器对象.

例如,以下是$button_a的设置方式:

$button_a = do with GTK::Simple::Button.new(label => 'bcd')
{
    .clicked.tap({ .sensitive = False; $button_b.sensitive = True });
    $_
}

如果$_不必被明确地返回,那将是很好的.例如,类似于:

$button_a = do cascade GTK::Simple::Button.new(label => 'bcd')
{
    .clicked.tap({ .sensitive = False; $button_b.sensitive = True });
}

另一个缺点是语法比Dart和Smalltalk方法级联语法更重要.更接近Dart风格的东西可能如下所示:

$button_a = GTK::Simple::Button.new(label => 'bcd')
    ..clicked.tap({ .sensitive = False; $button_b.sensitive = True });

解决方法

https://doc.perl6.org/routine/andthen
my $obj = IO::Path.new($*CWD) andthen do { .say; 42 }; say $obj.perl

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读