私はPerlで関数の署名が大好きです.


プログラミングの中で最も一般的なタスクの一つは関数内で引数を受け取ることです.Perlでは、歴史的に、このタスクはいくつかの形式をとりました.
sub foo {
  my $arg1 = shift;
  my $arg2 = shift;

  return $arg1 + $arg2;
}
多くのperlersが既に知っているように、shiftの声明はshift @_のための短い手です.そして、それは特別な@_リストから最初のアイテムを取ります.
このテーマには他のバリエーションがあります.
# Named arguments
sub foo {
  my %args = @_;
  my $arg1 = delete $args{arg1};
}

# Named arguments with a hashref
sub foo {
  my ($args) = @_;
  my $arg1 = delete $args->{arg1};
}

# Positional arguments in a single assignment
sub foo {
  my ($arg1, $arg2) = @_;
}
これは素晴らしい柔軟性であり、多くの人々は、この仕事を彼らの利点にする信じられないほどの方法を見つけました.関数の引数を実行するのと全く別の方法ですが、Perlが十分に長いことをしているならば、上記のすべてのサンプルは、警告に最も愛されていることがわかっています.
もちろん、デフォルトを使うこともできます.
sub foo {
  my $foo = shift || 1;
}
しかし、あなたが彼らがあなたに十分な議論をすることができないならば、あなたの呼び出し元が誤りを得ることを望むならば、どうですか?さて、以下のように関数プロトタイプを使うことができます.
sub foo($) {
  my $foo = shift;
}
このようにした場合、Use of uninitialized valueというエラーが発生します.しかし、まだプロトタイプを使用した後に通常と同じように引数を扱うことができます.
しかし、Perlのコミュニティは長い間、プロトタイプの使用を推奨していませんでした.構文が少し毛深いので、開発者がそれらを使用し始めたときに何をしようとしていたのかは、必ずしも明確ではありません.
早送りPerl 5.20と今、あなたは署名を持っている!
クイック注:私は行くつもりです.私は、私がなぜそれが好きであるかについて、あなたに話すつもりです.
関数シグネチャを使用すると、BoilerPlateを削除することができます(多くの場合、これはPerlプログラミングの時間的な伝統の一つであることを知っています.
sub some_function($a, $b) {
  return $a + $b;
}
閉じるこの動画はお気に入りから削除されています
my $some_closure = sub ($a, $b) {
  return $a + $b;
}
右;私は私のようなかなりの構文を持っている、私のためのdee dooのwhop右?閉じるこの動画はお気に入りから削除されています.
私が前に話したmojoliciousなことを覚えています?あなたがたった今愛しているべきです?または、それらのイベントベースのモジュールのいずれかを愛してきた?これはゴムと道路の恋に落ちると一緒に子犬を取得します.
# This is pseudo-code that might run!
use Mojo::Promise;

sub long_running_operation() {
  state $cached = [];

  return (scalar @{$cached} > 0)
    ? Mojo::Promise->resolve( shift @{$cached} )
    : Mojo::Promise->new( sub ($resolve, $reject) {
      my $retval = eval {
        perform_slow_lookup();
      }; if ($@ or not $retval) {
        return $reject->($@);
      }

      return $resolve->($retval);
    })->then( sub ($results = []) {
      $cached = { map { $_->{name} => $_ } @{$results} };
      return Mojo::Promise->resolve( shift @{$cached}; );
    });
}
ああ、私はあなたがfoo()と恋に落ちるようになると言うか?悪いことに、私はあなたに警告するべきでした.
だから今、機能の署名を使用すると、また、あなたのコードを小さく、より表現力のあるながら、バグのための表面積を削減し、ここでboilerplateの注目すべき量(このスニペットで約4行)を排除している.
署名がなければ、このコードは次のようになります.
# This is pseudo-code that might run!
use Mojo::Promise;

sub long_running_operation() {
  state $cached = [];

  return (scalar @{$cached} > 0)
    ? Mojo::Promise->resolve( shift @{$cached} )
    : Mojo::Promise->new( sub {
      my ($resolve, $reject) = @_;
      my $retval = eval {
        perform_slow_lookup();
      }; if ($@ or not $retval) {
        return $reject->($@);
      }

      return $resolve->($retval);
    })->then( sub {
      my $results = shift || [];
      $cached = { map { $_->{name} => $_ } @{$results} };
      return Mojo::Promise->resolve( shift @{$cached}; );
    });
}
参照それは世界の終わりではありませんが、あなたが何をしようとしているかを見るためにあなたが視覚的に解析しなければならないボイラープレート線を加えることによってコードの明快さのいくらかを取り去ります.
とにかく、それは私が私の心を横切っている間、私がトロールのGitthubにより多くのものを書いている間です.
良い一日を!