2011-06-16 14 views
8

私はMooseの作業を開始したばかりで、わからない奇妙な問題に遭遇しました。次のコード:Moose、Try :: Tiny、TryCatchで奇妙な動作が発生する

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Try::Tiny; 

{ 
    package Foo; 
    use Moose; 
    has x => (is => 'ro', isa => 'Int'); 
} 

my $f; 
try { 
    $f = Foo->new(x => 'x'); 
} catch { 
    die "oops\n"; 
} 
print $f->x . "\n"; 

は生成します。

Can't call method "x" on an undefined value at m2.pl line 19. 

を私はTryCatchTry::Tinyを交換する場合は、それは私はそれが必要引き受けるとして機能:

oops 

xがある場合でも、正しい値、たとえば5Try::Tinyはまだundefined valueエラーを生成します。

私が読んでいるすべてのMooseドキュメントはTry::Tinyを使用していますが、なぜこのコードが動作しないのか非常に混乱しています。私はここで何か完全に間違っているのですか?

答えて

16

Try::Tinyは、try /キャッチスタンザの終わりにセミコロンが必要です。

try { 
    $f = Foo->new(x => 'x'); 
} catch { 
    die "oops\n"; 
}; 

これはTry::Tinyの実装によるものである - trycatch両方だけの機能です。

+0

ガー、恥ずかしい見落とし。ありがとう! – Joe

+2

+1 *スタンザ*の素晴らしい使用のために。 – FMc

4

try {...} catch {...}は(モジュールによって提供されているので)組み込み関数ではありません。 - それは、様々な黒魔術を使用して可能である:)

try { 
    $f = Foo->new(x => 'x'); 
} catch { 
    die "oops\n"; 
}; 
print $f->x . "\n"; 

私はTryCatchが不足しているセミコロンを処理するためにどのように管理するかに答えることができません:Perl 5のでは、これはあなたがそうのようなセミコロンでそれを終了する必要があることを意味します

+8

TryCatchはDevel :: Declareを使用してパーサーを変更します。プロトタイプと匿名サブの創造的な使用に依存するのではなく、try/catchブロック用の新しい解析ルールを効果的に作成します。 – perigrin

+1

Devel :: Declareには「あまりにも多くの魔法」問題に関連するいくつかの論争があります:http://www.perlmonks.org/?node_id=832796 – daotoad

関連する問題