2016-08-03 6 views
6

属性を遅く構築する最良の方法は何ですか?遅延アクセサーを書く方法

class I { 
    has $!cheezeburger; 

    method cheezeburger { 
     given $!cheezeburger { 
      when .so {return $_} 
      default { 
       # build $cheezeburger, set attribute to it, return 
      } 
     } 
    } 
} 

これはたくさんのチーズバーガーです。それほど冗長ではない方法はありますか?

+4

'method cheezeburger {$!cheezeburger // = ...}' –

答えて

2

それが定義されていない場合、属性を初期化ブラッドによって与えられた実用的なソリューションは、多くの場合には十分でなければなりません:

class Foo { 
    has $!cheezeburger; 
    method cheezeburger { 
     $!cheezeburger //= do { ... } 
    } 
} 

別のアプローチは、時の役割に混合することにより、アクセサメソッドを置き換えるためにdoesを使用されるだろうプライベート属性にアクセスするために黒魔術(別名NQPのOPS)を使用して、その最初の呼び出し、:

class Foo { 
    has $!cheezeburger; 
    method cheezeburger { 
     self does role { 
      method cheezeburger { 
       use nqp; 
       nqp::getattr(self, Foo, '$!cheezeburger'); 
      } 
     } 
     $!cheezeburger = do { ... } 
    } 
} 
+0

私は 'do'ブロックが定義済みか等しい – beasy

4
class A { 
    has $!lazy; 
    method BUILD { $!lazy := Nil }; 
    method lazy { $!lazy := (my $a = 42) if $!lazy =:= Nil; $!lazy } 
}; 
my $a = A.new; 
say [$a.lazy, $a.lazy]; 

$!lazyが未定義の値を保持する場合は、いくつかのループをホップする必要があります。まず、Nil$!lazyにバインドして、コンテナが保持できない値を保持します。 $!lazyが依然としてNilにバインドされている場合は、新しいコンテナを作成し、そのコンテナに値を割り当てます。値が不変の場合は、余分なコンテナは必要ありません。 $!lazyに必要な型制約は、$aにする必要があります。これは、制約が変数/クラス・プロパティではなくコンテナのプロパティであるためです。

+0

:これをつかんでいます。要素のためのthx – beasy

+2

変数はコンテナ(代入演算子 '=')と不変の値(バインド演算子 ':=')を使用してバインドできます。どのコンテナがhttps://docs.perl6.org/language/containers#Custom_containersを参照しているかを理解する。 –

4

既存のモジュールを

lazy attribute modulesが2つあります。

ブラッドの$!cheezeburger //= do { ... };

普通のコードでは、多くのユースケースで十分でしょう、かなりストレートフォワードソリューションのように思えます。

何か良いですか?

#perl6フォークがほしいと思うかもしれません。

5月5日、7日、20日、6月5日、8日、20日に2015年に起こった、遅延性属性の初期化に関する最新の深刻な#perl6の議論。 pages of #perl6 log with at least one "will lazy" matchに "will lazy"と検索してください。これらの議論のうち、TL; DRは、rjbs、mst、および他のMooseユーザーがnice lazy属性の初期化に使用され、解決策がRakudoに追加されたことです。 masakや他の人には問題があると思っていたので、それは取り消されました。そして、モジュールスペースで素晴らしいソリューションが作成され、それが賢明だった場合はコアに戻ってくると考えました。

関連する問題