1

呼び出し元が値をオーバーライドできるようにしたいメソッドのセットがあるか、デフォルトでインスタンス変数になります。

だから私がやろうとしているのは:

method foo( Str :$blah = $self->blah ) {
    #doStuff
}

これは解析エラーをスローするので、どこでもこれを行うことになります

method foo( Str :$blah? ) {
    $blah = $self->blah unless defined $blah;
    #doStuff
}

恐ろしいことではありませんが、MooseX::Method::Signatures がデフォルトの概念をサポートし、他のすべての標準的な「メソッドの開始」行を修正すると、ばかげているように見えます。

私がこのようなことをしようとしていて、Web 上で同じ問題に遭遇した人を他に見つけることができない場合、私は常に間違った方法で問題に取り組んでいます。メソッドは、オブジェクトで動作するメソッドではなく、外部から呼び出すためのヘルパー関数であるため、実際の oo ではなく、機能的なプログラムを oo レイアウトに詰め込もうとしているようです。したがって、定義が間違っているだけなのか、それとも「ばかげている」のか、Parse::Method::Signatures でサポートされていないのかを確認するだけです。

4

1 に答える 1

1

知る限り、署名モジュールは Perl パーサーにフックされ、プロトタイプを処理するコードを挿入します。これが機能することは注目に値します。

とはいえ、デフォルトとして非定数値を使用すると問題が発生する可能性があります。また、コードを呼び出して値を事前設定すると、大混乱が生じる可能性があります。具体的には、値を事前入力するコードは、引数の値が指定されていない場合にのみ呼び出す必要がありますか?それとも常に呼び出す必要がありますか? 副作用についてはどうすればよいですか?どうあるべきcallerですか?グローバル$selfオブジェクトがある場合、スコープ ルールで明確に指示されているため、メソッド呼び出しを受け取るべきではありませんか? (our $x=5; my $x=$x;有効ですが、そうでmy $x=$xはありません)。さらに良いことに、デフォルト値の人口メソッドの呼び出しが同じメソッドを呼び出すが、オプションのパラメーターの値がない場合はどうなるでしょうか?

いつでも昔ながらのオプションのパラメーターにフォールバックできます。

sub foo {
  my ($self, $blah) = @_;
  # something like my ($self, $blah) = (@_, $self->blah); wouldn't work, of course.
  $blah //= $self->blah; # nicer than old `unless defined`
  ...;
}

または、この場合:

method foo (:$blah?) {
   $blah //= $self->blah
}

defined-or 演算子のこの使用法は非常に楽しいと思います。

于 2012-12-05T13:19:11.410 に答える