if ($the_object->the_attribute) {
方法the_attribute
の戻り値がtrueの場合にチェックします。 Trueは、0
ではなく、空の文字列q{}
またはundef
ではないことを意味します。
しかし、あなたは、オブジェクトが存在するかどうかを知りたいと言っています。
いくつかの基本を先に進んでください。
# | this variable contains an object
# | this arrow -> tells Perl to call the method on the obj
# | | this is a method that is called on $the_object
# | | |
if ($the_object->the_attribute) {
# ( )
# the if checks the return value of the expression between those parenthesis
あなたはいくつか混乱しているようです。
まず、$the_object
がオブジェクトであると考えられます。これはおそらく、次のような呼び出しから来たでしょう:
my $the_object = Some::Class->new;
また、他の関数呼び出しから返された可能性があります。他のオブジェクトが返すかもしれない。
my $the_object = $something_else->some_property_that_be_another_obj
今the_attribute
は、オブジェクト内のデータの特定の部分を返すメソッド(つまり、関数のようだ)です。クラスの実装(オブジェクトの構築計画)に応じて、その属性が設定されていない場合(がに初期化された場合)、それはちょうどundef
、またはその他の値を返すことがあります。
表示されているエラーメッセージは、the_attribute
とは関係ありません。そうだった場合は、ブロック内のコードを呼び出さないでください。 if
小切手はそれをキャッチし、else
に行くことを決定するか、またはelse
がない場合は何もしません。
undef
のメソッドを呼び出そうとしているというエラーメッセージが表示されます。 $the_object
でthe_attribute
アクセサーメソッドと呼んでいることがわかりました。従って$the_object
はundef
です。
何かが真の値を持っているかどうかを確認する最も簡単な方法は、ちょうどif
にそれを置くことです。しかし、あなたはすでにそれを知っているようです。
if ($obj) {
# there is some non-false value in $obj
}
これで、$obj
が真であることが確認されました。だから、それは目的である可能性があります。だから今あなたの方法を呼び出すことができます。
if ($obj && $obj->the_attribute) { ... }
この
は
$obj
の真ネスをチェックして、
$obj
で何かがある場合にのみ続行されます。そうでない場合は、
&&
の右側を決して呼ぶことはなく、エラーは発生しません。
しかし、$obj
がメソッドを持つオブジェクトであるかどうかを知りたい場合は、can
を使用できます。 アトリビュートは、オブジェクト内に格納されている値のアクセサメソッドに過ぎないことに注意してください。 $obj
がない場合
if ($obj->can('the_attribute')) {
# $obj has a method the_attribute
}
しかし、それは爆破することができます。
$obj
が実際にオブジェクトであるかどうかわからない場合は、Safe::Isaモジュールを使用できます。これは、あなたの多分オブジェクト上のメソッドを安全に呼び出すために使用できるメソッド$_call_if_object
を提供します。
$maybe_an_object->$_call_if_object(method_name => @args);
あなたの電話はに翻訳されます。
my $the_attribute = $obj->$_call_if_object('the_attribute');
if ($the_attribute) {
# there is a value in the_attribute
}
セーフ::イサから$_isa
と$_can
を使用することができるのと同じ方法。
1)はい、方法は$
で始まる、それは本当に変数です。この方法とその理由についてもっと知りたい場合は、You did what?のmstでトークをご覧ください。
いいえ。objが作成されているかどうかは確認していません。 '$ the_object-> the_attribute'の戻り値をチェックしています。エラーメッセージは' $ the_object'がオブジェクトではなく 'undef'であることを意味します。 ( '$ the_object'がどこから来たのか、そしてそれが持っていると思われる属性のような)もう少しのコードを含めると、私は自分の答えを洗練することができます。 – simbabque