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