- で展開する引数を台無しにしました
Values
。最初の引数をに割り当て、$num
次にshift
最初の引数をに割り当てます。$last
したがって$num
、と$last
は常に同じ値になります。
- と比較
$last
しますが$last
、これは役に立ちません。
- クロージャーをに入れますが、フィールド
$hashtable->{compare}
の内容である。を実行します。check
undef
- クロージャは、現在選択されているファイルハンドルにデータを出力しますが、有用な情報は返しません。戻り値を出力するのは賢明ではないようです。
$num1
と$num2
はクロージャであり、数値ではありません。クロージャは引数をアンパックしないため、クロージャに引数を渡しても何も起こりません。
問題に対処する必要がある実装は次のとおりです。
use strict; use warnings;
use Test::More;
sub create_closure {
my ($x) = @_;
my $operations = {
compare => sub { my ($y) = @_; return $x <=> $y },
add => sub { my ($y) = @_; return $x + $y },
value => $x,
};
return $operations;
}
# some tests
my $ops = create_closure(15);
ok( $ops->{compare}->(15) == 0, "compare to self" );
ok( $ops->{compare}->(20) < 0, "compare to larger");
ok( $ops->{add}->(5) == 20, "add");
ok( $ops->{value} == 15, "value");
my $ops1 = create_closure(150);
ok( $ops1->{compare}->($ops->{value}) > 0, "compare to smaller value");
done_testing;
編集
2つを直接比較することはできません$ops
が、元の値を返すフィールドを作成することはできます。
ただし、そのようなことをより頻繁に行う場合は、オブジェクトと演算子のオーバーロードを使用することをお勧めします。
use strict; use warnings; use Test::More;
{
package Ops;
sub new {
my ($class, $val) = @_;
if (ref $val eq __PACKAGE__) {
($val, $class) = ($$val, __PACKAGE__);
}
bless \$val => $class;
}
use overload
# overload numeric coercion
'0+' => sub { ${ $_[0] } },
# overload addition. Take care to dereference to avoid infinite loops.
'+' => sub {
my ($self, $other) = @_;
Ops->new($$self + $other);
},
# overload numeric comparision. Take care to swap the args if neccessary.
'<=>' => sub {
my ($self, $other, $swapped) = @_;
(my $val, $other) = $swapped ? ($other, $$self) : ($$self, $other);
Ops->new($val <=> $other);
}
}
my $ops1 = Ops->new( 15);
my $ops2 = Ops->new(150);
# some tests
ok( ($ops1 <=> 15) == 0, "compare to self" );
ok( ($ops1 <=> 20) < 0, "compare to larger");
ok( ($ops1 + (5)) == 20, "add");
ok( $ops1 == 15, "value");
ok( ($ops2 <=> $ops1) > 0, "compare to smaller value");
done_testing;