Dart和Smalltalk有method cascades。方法級聯語法
似乎可以通過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;
下面是使用在一些地方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;
};
我的問題是否,在Perl 6中有沒有一種更習慣於表達方法級聯風格的方式?
缺點do with
是你必須明確地返回$_
。使用傳統的方法級聯,原始接收器對象被隱式返回。
例如,這裏的$button_a
是如何設置的:
$button_a = do with GTK::Simple::Button.new(label => 'bcd')
{
.clicked.tap({ .sensitive = False; $button_b.sensitive = True });
$_
}
這將是很好,如果$_
沒有被explicly返回。例如,像:
$button_a = do cascade GTK::Simple::Button.new(label => 'bcd')
{
.clicked.tap({ .sensitive = False; $button_b.sensitive = True });
}
另一個缺點do with
是,語法比飛鏢和Smalltalk方法級聯語法更重量級的。更接近於達特風格可能看起來像:
$button_a = GTK::Simple::Button.new(label => 'bcd')
..clicked.tap({ .sensitive = False; $button_b.sensitive = True });
謝謝,ugexe!我還沒有用過'然後呢'。 – dharmatech
@raiph查看我剛發佈的答案。它需要定義一個「級聯」子程序的方法。 – dharmatech