2016-07-18 24 views
2

を行くすべて1で複数の字句形式をバインドする抽象化の方法:ある意味でそれは大したことではありません繰り返すよう再利用可能な、

sub method1 { 
    my ($foo, $bar) = _get_things(); # this line... 
} 

sub method2 { 
    my ($foo, $bar) = _get_things(); # ...is repeated here 
} 

が繰り返さラインは、ちょうど1行です。しかし、これは、リスト($foo, $bar)がこれまでに変更された場合、これらの行をすべて変更する必要があるという欠点があります。 Cでは、この問題を解決するためにプリプロセッサを使用することがあります。 Perlでそれを行うための良いイディオムはありますか?次の擬似perlのような何か:

MACRO_DEFINITION my ($foo, $bar) = _get_things(); 

sub method1 { 
    MACRO_CALL 
    print "hi $foo"; 
} 

sub method2 { 
    MACRO_CALL 
    print "hi $foo and $bar"; 
} 

注:私は地元の字句スカラに結合していリストを返す_get_things()理由は、後者の例に示すように、私は、文字列の補間でそれらを使用したいということです。

+0

私はいくつかのひどい解決策を考えることができますが、良いものはありません。 – melpomene

+2

"リスト($ foo、$ bar)が変更された場合、これらの行はすべて変更する必要があります。" _get_things()はハッシュリファレンスまたはオブジェクトを返すようになっているので、それを排除した。どうして? – ThisSuitIsBlackNot

+0

これらのメソッド、 '$ foo'と' $ bar'を使う方法はありますか?その場合、リファクタリングから始めます。それは、メソッドが別の抽象レベルを持つ必要があることを意味します。または、なぜ名前自体が重要なのですか(これは名前に関するものなのでしょうか)。 – zdim

答えて

3

サブが非常に少ないパラメータを持つ場合、またはパラメータが変更される可能性がある場合は、名前付きパラメータをエミュレートするためにハッシュまたはハッシュリファレンスを渡す必要があります。

さらに多くの結果が返され、その結果はとなる可能性があります。サブリーダーからハッシュリファレンスを返す必要があります。そして、呼び出し側でそのハッシュリファレンスを使用するだけです(文字列補間でもそうです)。

use strict; 
use warnings; 

sub method2 { 
    my $thing = _get_things(); 
    print "hi $thing->{'foo'} and $thing->{'bar'}\n"; 
} 

sub _get_things { 
    return { 
     'foo' => 42, 
     'bar' => 'quux', 
    }; 
} 

method2(); 
関連する問題