我试图让深刻的强制工作Type::Tiny
没有任何成功.从手册中可以说:
"某些参数化类型约束可以自动获取强制,如果它们的参数有强制.例如:
ArrayRef[Int->plus_coercions(Num, q{int($_)}) ]
......做你的意思!"
我试图完成的是得到这样的"做我的意思":
package Person;
use Types::Standard -types;
use Moo;
has name => (is => 'ro', isa => Str);
package Family;
use Types::Standard -types;
use Moo;
has members => (is => 'ro', isa => ArrayRef[InstanceOf['Person']]);
package main;
my $family = Family->new(members => [
'mom',
Person->new(name => 'dad'),
Person->new(name => 'girl'),
'dog'
]);
Run Code Online (Sandbox Code Playgroud)
当Family
使用元素进行实例化时,Str
它们应该被自动强制转换为Person
对象.我尝试了一系列不同的想法(plus_coercions,类型库等),没有任何运气.他们都以同样的方式失败.
使用plus_coercions时(从Str
到Object
)
package Family;
has members => (
is => …
Run Code Online (Sandbox Code Playgroud) 在这个答案中,我找到了一个简单TO_JSON
方法的建议,这是将祝福对象序列化为JSON所必需的.
sub TO_JSON { return { %{ shift() } }; }
Run Code Online (Sandbox Code Playgroud)
有人可以详细解释它是如何工作的吗?
我改成了:
sub TO_JSON {
my $self = shift; # the object itself – blessed ref
print STDERR Dumper $self;
my %h = %{ $self }; # Somehow unblesses $self. WHY???
print STDERR Dumper \%h; # same as $self, only unblessed
return { %h }; # Returns a hashref that contains a hash.
#return \%h; # Why not this? Works too…
}
Run Code Online (Sandbox Code Playgroud)
很多问题...... :(简单地说,我无法理解3行Perl代码.;(
我需要 …
我正在尝试使用GObject Introspection和Moo在Perl中创建一个Gtk3应用程序.有一个来自Gtk的非Moo类Gtk::ApplicationWindow
,我通过Moo使用它进行子类化extends 'Gtk::ApplicationWindow'
.问题是,当创建该子类的对象时,它仍然是父类的类型 - 即Gtk::ApplicationWindow
.
我通过继承自己的非基于Moo的类来尝试相同的事情,并且从这个子类创建的对象具有正确的类型.造成这种差异的原因是什么?
use v5.10;
use strict;
use warnings;
# Import the Gtk classes (non-Moo)
use Glib::Object::Introspection;
Glib::Object::Introspection->setup(basename => 'Gtk', version => '3.0', package => 'Gtk');
Glib::Object::Introspection->setup(basename => 'Gio', version => '2.0', package => 'Gio');
#################################################
{
# A dummy non-Moo class
package ClassNonMoo;
sub new { bless {}, shift; }
}
{
# Moo class extending the dummy class
package ClassMoo;
use Moo;
extends 'ClassNonMoo';
sub …
Run Code Online (Sandbox Code Playgroud) 我的Dancer app模块中有以下代码:
package Deadlands;
use Dancer ':syntax';
use Dice;
our $VERSION = '0.1';
get '/' => sub {
my ($dieQty, $dieType);
$dieQty = param('dieQty');
$dieType = param('dieType');
if (defined $dieQty && defined $dieType) {
return Dice->new(dieType => $dieType, dieQty => $dieQty)->getStandardResult();
}
template 'index';
};
true;
Run Code Online (Sandbox Code Playgroud)
我有一个名为Dice.pm的Moops类,如果用.pl文件测试它就可以正常工作,但是当我尝试通过Web浏览器访问它时,我收到以下错误:找不到对象方法"new"通过包"骰子"(也许你忘了加载"骰子"?).
我可以和Dancer一起做吗?
以下是Dice.pm的相关代码:
use 5.14.3;
use Moops;
class Dice 1.0 {
has dieType => (is => 'rw', isa => Int, required => 1);
has dieQty => (is => 'rw', isa => Int, …
Run Code Online (Sandbox Code Playgroud) 我目前正在一家公司工作,我们正在进行Perl开发.然而,代码非常混乱,使用了非常古老的Perl习语,所以我决定慢慢清理它并教我的同事关于Modern :: Perl,良好的软件设计,OOP - 抽象,耦合,继承,SOLID原则等等.有一个缺点,我在这里工作只有一个月,所以我在这里很新.
我的问题是:我可以(如果是这样的话)说服他们考虑从普通的Perl OO切换到Moo(se)吗?它的优点是什么?我需要他们考虑的充分理由.
使用这些模块是否有很大的性价比?我从经验中知道,使用这些模块非常舒服(特性也非常好),但我担心由于性能原因它们会拒绝切换.
所以.有没有优势,你会如何描述那些陷入2000年前时代的Perl开发者?
使用Moo::Role
,我发现循环导入正在默默地阻止执行before
我的方法的修饰符.
我有一个Moo::Role
在MyRole.pm
:
package MyRole;
use Moo::Role;
use MyB;
requires 'the_method';
before the_method => sub { die 'This has been correctly executed'; };
1;
Run Code Online (Sandbox Code Playgroud)
......消费者MyA.pm
:
package MyA;
use Moo;
with ( 'MyRole' );
sub the_method { die; }
1;
Run Code Online (Sandbox Code Playgroud)
..另一个在MyB.pm
:
package MyB;
use Moo;
with ( 'MyRole' );
sub the_method { die 'The code should have died before this point'; }
1;
Run Code Online (Sandbox Code Playgroud)
当我运行这个script.pl
:
#!/usr/bin/env perl
package main; …
Run Code Online (Sandbox Code Playgroud) Pyomo 中多目标优化的任何示例?
我正在尝试最小化 4 个目标(非线性),并且我想使用 pyomo 和 ipopt。还可以访问 Gurobi。
我想看一个非常简单的例子,其中我们尝试针对决策变量列表(不仅仅是一个维度,可能是一个向量)针对两个或多个目标(一个最小化和一个最大化)进行优化。
我拥有的 Pyomo 书(https://link.springer.com/content/pdf/10.1007%2F978-3-319-58821-6.pdf)没有提供任何线索。
我在这个网站上的第一个问题,我来得很快.我是开发人员,我主要使用Python和Perl.我很有激情,我非常喜欢这个发展.
我的第一个问题是关于Perl,Moo和Type :: Tiny.Type :: Tiny当然是与Moo一起使用的一个很棒的模块,但我会在另一个问题上回到这个主题.
我发现了Types :: Path :: Tiny Moose和Moo的模块强制,所以我尝试在我的类中创建一个属性目录,就像文档中描述的一样,因为我的项目在Moose中工作,但是因为我搬进了Moo ,它不再有效:
package MahewinBlogEngine::Common;
use strict;
use warnings;
use feature "state";
use Moo;
use Types::Path::Tiny qw/Path AbsPath/;
use CHI;
use MahewinBlogEngine::Renderer;
use Type::Params qw( compile );
use Types::Standard qw( slurpy Object Str HashRef ArrayRef );
=attr directory
rw, required, Str. The directory contain articles.
=cut
has 'directory' => (
is => 'rw',
isa => AbsPath,
required => 1,
coerce => 1,
);
Run Code Online (Sandbox Code Playgroud)
在我的测试目录中:
my $articles = MahewinBlogEngine->articles( …
Run Code Online (Sandbox Code Playgroud) 我想削弱Sub :: Quote生成的代码中的捕获变量.例如,这是未引用的替代方案:
use 5.10.0;
use Scalar::Util qw[ weaken ];
{
my $s = 'foo';
my $x = sub { say $s };
weaken( my $y = $x );
my $bar = sub { &$y };
&$bar;
$x = undef;
&$bar
}
Run Code Online (Sandbox Code Playgroud)
和输出:
foo
Can't use an undefined value as a subroutine reference [...]
Run Code Online (Sandbox Code Playgroud)
这是我的Sub :: Quote尝试:
use 5.10.0;
use Sub::Quote;
use Scalar::Util qw[ weaken ];
{
my $s = 'foo';
my $x = sub { say $s …
Run Code Online (Sandbox Code Playgroud) 我有这个代码:
package Foo;
use Moo;
has attr => ( is => "rw", trigger => 1 );
sub _trigger_attr
{ print "trigger! value:". shift->attr ."\n" }
package main;
use Foo;
my $foo = Foo->new( attr => 1 );
$foo->attr( 2 );
Run Code Online (Sandbox Code Playgroud)
它返回:
$ perl test.pl
trigger! value:1
trigger! value:2
Run Code Online (Sandbox Code Playgroud)
这是Moo中触发器的默认记录行为.
如果通过构造函数设置属性,如何禁用触发器执行?
我当然可以这样做:
package Foo;
use Moo;
has attr => ( is => "rw", trigger => 1 );
has useTriggers => ( is => "rw", default => 0 );
sub _trigger_attr
{ …
Run Code Online (Sandbox Code Playgroud)