18

左辺値サブルーチンの用途がわかりませんか? 通常のサブルーチンでは実現できないことは何ですか? いくつかの例を投稿していただけますか?

ありがとう

4

4 に答える 4

20

左辺値サブルーチンをオブジェクト メンバーのセッターとして使用できます。

sub x : lvalue {
    my $self = shift;
    $self->{x};
}

じゃあ後で:

$foo->x = 5;

これにより、後でオブジェクトの実装方法を変更したい場合に備えて、メンバーを直接設定する直観性とセッターをカプセル化する柔軟性が組み合わされます。Perl でメンバーを設定する次のより伝統的な方法と比較してください。

直感的だが壊れやすい。$foo の実装方法を変更するとどうなりますか?

$foo->{x} = 5;

従来のセッター方式。割り当てに相当するものに割り当て構文を使用しません。

$foo->set_x(5);

もちろん、左辺値メソッドは Perl コミュニティに実際に受け入れられたことはなく、左辺値サブルーチンの使用は「奇妙」であり、直観性のために得られるものはすべて、その奇妙さによって失われます。

于 2009-02-02T23:55:43.460 に答える
14

LValueは避けることをお勧めします。それらは楽しくてすべてですが、すべての潜水艦がどのように機能するかについて推測する新しいユーザーを混乱させるので、より良い方法が利用できる場合はコードで避ける必要があります。

LValueの結果を使用してダーティな作業を行うことが非常に実用的な場合があります。

substr( $string, $start, $stop ) = 'somevalue' # replaces the specified part of the substring. 

ただし、これも同じことを行います。

substr( $string, $start, $stop , 'somevalue' ); 

ここでの違いは、ほとんどが前者であるため、関数自体ではなく、それを使用するコードに動作を委任するため、表現力が大幅に向上します。

例えば:

substr( $string, $start, $stop ) =~ s/a/b/g 

あなたがする必要があります

my $x = substr( $string, $start, $stop ); 
$x =~ s/a/b/g/; 
substr( $string, $start, $stop, $x );

これは少し厄介です。

ただし、ここにはさらに厄介な点があります。これは、$ xを使用してその置換を行うことが、文字列を変更するために遡及的に機能するかどうかを検討する必要があるためです(substrがLValueサブであるため)。そうは思わないが、それが曖昧であるかどうかを覚えておくためにマニュアルをチェックしなければならず、それは悪いことだ。

于 2009-02-02T21:25:29.377 に答える
6

通常の Perl でそれらを使用することについてはあまり話せませんが、スライスやピドルの他のサブセクションを取得するときに、Perl データ言語で広く使用されています。例えば:

my $a = sequence(100);
# use lvalue in this increment:
$a->where($a < 10)++;

# Zero-out the last four elements
# notice the use of the overloaded .= operator:
$a->slice("-10:") .= 0;

Perl の多くの機能と同様に、この機能はエコシステム全体であまり使用されていませんが、少なくともこのニッチで使用すると、PDL のユーザーの生活がずっと楽になります。

于 2012-01-14T20:24:11.163 に答える