Dart和Smalltalk有方法级联.
似乎可以通过类似的风格来实现do with.
例如,这是一个简单的程序,它使用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;
Run Code Online (Sandbox Code Playgroud)
这是do with在几个地方使用的等效程序,以实现类似于方法级联的效果:
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;
};
Run Code Online (Sandbox Code Playgroud)
我的问题是,在Perl 6中表达方法级联风格是否有更惯用的方法?
缺点do with是您必须明确地返回$_.使用传统方法级联,隐式返回原始接收器对象.
例如,这是如何$button_a设置:
$button_a = do with GTK::Simple::Button.new(label => 'bcd')
{
.clicked.tap({ .sensitive = False; $button_b.sensitive = True });
$_
}
Run Code Online (Sandbox Code Playgroud)
如果$_不必明确地返回它将是很好的.例如,类似于:
$button_a = do cascade GTK::Simple::Button.new(label => 'bcd')
{
.clicked.tap({ .sensitive = False; $button_b.sensitive = True });
}
Run Code Online (Sandbox Code Playgroud)
另一个缺点do with是语法比Dart和Smalltalk方法级联语法更重要.更接近Dart风格的东西可能如下所示:
$button_a = GTK::Simple::Button.new(label => 'bcd')
..clicked.tap({ .sensitive = False; $button_b.sensitive = True });
Run Code Online (Sandbox Code Playgroud)
https://docs.raku.org/routine/andthen
my $obj = IO::Path.new($*CWD) andthen do { .say; 42 }; say $obj.perl
Run Code Online (Sandbox Code Playgroud)