我有一个类,我想在其id属性上应用字符串重载.但是,Moose不允许在属性访问器上进行字符串重载.例如:
package Foo;
use Moose;
use overload '""' => \&id, fallback => 1;
has 'id' => (
is => 'ro',
isa => 'Int',
default => 5,
);
package main;
my $foo = Foo->new;
print "$foo\n";
Run Code Online (Sandbox Code Playgroud)
以上将给出错误:
You are overwriting a locally defined method (id) with an accessor at C:/perl/site/lib/Moose/Meta/Attribute.pm line 927
Run Code Online (Sandbox Code Playgroud)
我尝试了几种方法来解决这个问题:
标记id is => bare,并用我自己的访问器替换它:sub id {$_[0]->{id}}.但这只是一个黑客.
让字符串重载器使用另一个方法,只需委托回id : sub to_string {$_[0]->id}.
我只是想知道是否有人有更好的方法这样做?
1年前在这里问了同样的问题.我正在寻找今天的状态更新.
我有一个数据库很少更改的应用程序,并且应用程序需要从数据库中进行大量读取,这会显着降低性能.其中许多读取完全相同.所以我想让DBI缓存数据库读取的结果.
例如,
$sth = $dbh->prepare('SELECT a, b FROM a_table WHERE c = ?');
$sth->execute(5);
$sth->execute(2);
$sth->execute(5); # this call loads the cached result set
Run Code Online (Sandbox Code Playgroud)
我首先想到的是这是什么prepare_cached,但我意识到它只缓存语句句柄本身而不是语句句柄的实际执行.
我想我可以通过在memoized sub中包装语句执行来实现我想要的.但我只是看到DBI本身是否有快捷方式.
我想测试一个带有表单的页面,该表单在提交时将重定向到提交项目的结果页面.
我的Mojolicious控制器包含:
sub submit_new {
my $self = shift;
my $new = $self->db->resultset('Item')->new( {
title => $self->param('title'),
description => $self->param('description'),
} );
$new->insert;
# show the newly submitted item
my $id = $new->id;
$self->redirect_to("/items/$id");
}
Run Code Online (Sandbox Code Playgroud)
该控制器的测试脚本包含:
use Test::More;
use Test::Mojo;
my $t = Test::Mojo->new('MyApp');
my $tx = $t->ua->build_form_tx('/items/new/submit' => $data);
$tx->req->method('POST');
$t->tx( $t->ua->start($tx) )
->status_is(302);
Run Code Online (Sandbox Code Playgroud)
我的问题是它停止了302状态.如何继续重定向,以便我可以验证生成的项目页面?
我有以下逻辑:
sub test {
my ($x, $y) = @_;
die unless defined $x || defined $y;
# uncoverable condition false
return $x // $y;
}
test( 1, 2 );
test( 1, undef );
test( undef, 2 );
test( undef, undef );
Run Code Online (Sandbox Code Playgroud)
该return声明将永远不会被覆盖的情况,其中$x和$y都是不确定的.因此,覆盖率报告指出该条件未被发现:
% | coverage | condition
------------------------------
67 | A | B | dec | $x // $y
|-------------|
===> | 0 | 0 | 0 |
| 0 | 1 | 1 …Run Code Online (Sandbox Code Playgroud) 通过返回结果集而不是表或视图的mssql存储过程向我提供了从db读取的访问权限.但我希望能够使用ORM读取数据.
我试图使用DBIx::Class::ResultSource::View过程调用(例如EXEC my_stored_proc ?)作为自定义查询,但这不起作用,因为它试图将过程调用转换为select语句.
有人有另一个建议吗?
我刚刚向Perl程序引入了线程,其中一个模块使用了Memoize.我收到此错误消息:
线程1异常终止:在禁止标量上下文中调用匿名函数; 断层
如果我同时拥有线程和Memoize,则会发生错误,但如果我删除其中一个元素,则会消失.但问题不在于Memoize不是线程安全的 - 在我的代码中,所有的memoization都发生在同一个线程中.
这是Memoize的错误吗?有没有办法可以解决这个问题?否则我将摆脱Memoize.
以下是一些示例代码来隔离问题:
use strict;
use warnings;
use threads;
use Thread::Semaphore;
use Memoize;
my $semaphore = Thread::Semaphore->new;
memoize('foo');
sub foo {
return shift;
}
sub invoke_foo {
$semaphore->down; # ensure memoization is thread-safe
my $result = foo(@_);
$semaphore->up;
return $result;
}
my @threads;
foreach (1 .. 5) {
my $t = threads->create( sub { invoke_foo($_) });
push @threads, $t;
}
$_->join foreach @threads;
Run Code Online (Sandbox Code Playgroud) 我意识到所有MooseX模块通常都不可能,特别是当模块深入研究Moose和Mouse不同的元类时.
但是这个问题出现了,因为有时MooseX模块在MouseX命名空间中没有等效物,我发现我仍然可以在我的Mouse类中使用MooseX模块.但是我想问一般这个问题,即使有可用的MouseX(假设我太懒了,不能安装MouseX,或者MooseX版本是新版本的新功能).
例如,以下内容有效:
package Foo;
use Mouse;
use MooseX::Types::Common::Numeric 'PositiveInt';
has 'bar' => (
is => 'rw',
isa => PositiveInt,
);
Run Code Online (Sandbox Code Playgroud)
当我查看MouseX::Types::Common::Numeric源代码时它几乎是一个完全相同的副本MooseX::Types::Common::Numeric,尽管MouseX :: Types中存在差异,这是一个依赖项.由于它是perl代码,因此使用MouseX模块也没有特别的性能优势.
因此,如果我们有一个Mouse类并且可以选择使用等效的MooseX和MouseX模块,那么我们选择MouseX选项的原因是什么?为什么MouseX等价?
顺便问一下,我们应该如何与此相关Any::Moose?
我尝试了以下内容:
package Foo;
sub new {
my ($type) = @_;
return bless {}, $type;
}
package Bar;
use Moose;
package Baz;
use Moose;
use MooseX::Method::Signatures;
method exec1 (Foo $f, Bar $b) {
...;
}
method exec2 ($f where {$_->isa('Foo')}, Bar $b) {
...;
}
Run Code Online (Sandbox Code Playgroud)
我发现exec2可以工作,但对于exec1,存在编译时错误.如果Foo是Mouse对象(这些是我无法更改的类),则会发生同样的错误.
'Foo' could not be parsed to a type constraint - maybe you need to pre-declare the type with class_type at C:/strawberry/perl/site/lib/Parse/Method/Signatures/TypeConstraint.pm line 74
Run Code Online (Sandbox Code Playgroud)
但有没有办法可以使用exec1签名?
perl ×8
moose ×3
dbi ×1
dbix-class ×1
devel-cover ×1
messaging ×1
mojolicious ×1
performance ×1
unit-testing ×1
zeromq ×1