2016-06-01 4 views
6

ダーツとスモールトークはmethod cascadesです。メソッドカスケード構文

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; 
}; 

私の質問:

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; 

ここで方法カスケードと同様の効果をachiveするためにいくつかの場所でdo withを使用して同等のプログラムです。たとえば

は、ここGTK::Simpleが使用する単純なプログラムですPerl 6でメソッドのカスケードスタイルを表現するための慣用的な方法がありますか?

do withの欠点は、明示的に$_を返す必要があることです。従来のメソッドカスケードでは、元のレシーバオブジェクトが暗黙的に返されます。

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

$_がexplicly返却する必要はありませんでした場合、それはいいだろう:

例えば、ここで$button_aが設定されている方法です。例えば、のようなもの:do with

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

別の欠点は、構文はダートとSmalltalkの方法カスケードの構文よりもヘビー級であるということです。

このサブルーチンで
$button_a = GTK::Simple::Button.new(label => 'bcd') 
    ..clicked.tap({ .sensitive = False; $button_b.sensitive = True }); 

答えて

4

https://doc.perl6.org/routine/andthen

my $obj = IO::Path.new($*CWD) andthen do { .say; 42 }; say $obj.perl 
+0

ありがとう、ugexe!私は 'と'まだ使わなかった。 – dharmatech

+0

@raiph私が今投稿した答えを見てください。これは 'カスケード'サブルーチンを定義するアプローチをとる。 – dharmatech

2

:ダートスタイルに近いものは次のようになります次のように

sub cascade ($obj, &proc) { proc($obj); $obj; } 

の例では、書くことができます。

use v6; 

use GTK::Simple; 

sub cascade ($obj, &proc) { proc($obj); $obj; } 

GTK::Simple::App.new(title => 'abc').&cascade: { 

    my $app = $_; 

    my $button; 

    .set-content: 
     GTK::Simple::VBox.new(

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

      $button = GTK::Simple::Button.new(label => 'cde').&cascade: { 
       .clicked.tap({ $app.exit; }); 
      } 
     ); 

    .border-width = 20; 

    .run; 
}; 
+0

うん。演算子名 'andthen'が気に入らなくても、それは基本的に'カスケード 'サブの改良版であることに同意しますか? – raiph

+0

@raiph 'andthen'は「レシーバオブジェクト」を返しません。たとえば、 '(10 andthen {20}; 30 and then {40})'(20 40) 'を返します。 '(10.&カスケード:{20}; 30.カスケード:{40})'は '(10 30)'を返します。 – dharmatech

2

私はdo withではなく、givenを使用すると、まったく同じ機能のためにもっと慣用的だと思います。与えられたトピックは、次のブロックの値$_の値として渡されます。