标签: moo

类型::微小和深刻的强制

我试图让深刻的强制工作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时(从StrObject)

package Family;

has members => (
  is => …
Run Code Online (Sandbox Code Playgroud)

perl moo

9
推荐指数
1
解决办法
348
查看次数

不兼容的Perl对象并为convert_blessed构造TO_JSON方法

这个答案中,我找到了一个简单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代码.;(

我需要 …

perl moose moo

8
推荐指数
2
解决办法
1168
查看次数

为什么我的Moo对象继承自非Moo类,为某些模块添加到父包中?

我正在尝试使用GObject IntrospectionMoo在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)

perl moo gobject-introspection

8
推荐指数
1
解决办法
505
查看次数

我可以在Dancer中实例化一个对象来返回要显示的值吗?

我的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 dancer moo moops

6
推荐指数
1
解决办法
157
查看次数

使用Moo(se)而不是Perl OO的真正优势

我目前正在一家公司工作,我们正在进行Perl开发.然而,代码非常混乱,使用了非常古老的Perl习语,所以我决定慢慢清理它并教我的同事关于Modern :: Perl,良好的软件设计,OOP - 抽象,耦合,继承,SOLID原则等等.有一个缺点,我在这里工作只有一个月,所以我在这里很新.

我的问题是:我可以(如果是这样的话)说服他们考虑从普通的Perl OO切换到Moo(se)吗?它的优点是什么?我需要他们考虑的充分理由.

使用这些模块是否有很大的性价比?我从经验中知道,使用这些模块非常舒服(特性也非常好),但我担心由于性能原因它们会拒绝切换.

所以.有没有优势,你会如何描述那些陷入2000年前时代的Perl开发者?

perl moose moo

6
推荐指数
2
解决办法
935
查看次数

如何处理:由于循环导入,Moo :: Role的`before`修饰符被静默跳过?

使用Moo::Role,我发现循环导入正在默默地阻止执行before我的方法的修饰符.

我有一个Moo::RoleMyRole.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)

perl role moo

6
推荐指数
1
解决办法
116
查看次数

多目标优化示例 Pyomo

Pyomo 中多目标优化的任何示例?

我正在尝试最小化 4 个目标(非线性),并且我想使用 pyomo 和 ipopt。还可以访问 Gurobi。

我想看一个非常简单的例子,其中我们尝试针对决策变量列表(不仅仅是一个维度,可能是一个向量)针对两个或多个目标(一个最小化和一个最大化)进行优化。

我拥有的 Pyomo 书(https://link.springer.com/content/pdf/10.1007%2F978-3-319-58821-6.pdf)没有提供任何线索。

minimize maximize moo ipopt pyomo

6
推荐指数
2
解决办法
5192
查看次数

如何使用Types :: Path :: Tiny with Moo

我在这个网站上的第一个问题,我来得很快.我是开发人员,我主要使用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)

perl types moose coerce moo

5
推荐指数
1
解决办法
981
查看次数

使用Sub :: Quote弱化捕获

我想削弱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)

perl moo

5
推荐指数
1
解决办法
74
查看次数

如何在构造对象时不执行触发器

我有这个代码:

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)

perl moo

4
推荐指数
2
解决办法
116
查看次数

标签 统计

moo ×10

perl ×9

moose ×3

coerce ×1

dancer ×1

gobject-introspection ×1

ipopt ×1

maximize ×1

minimize ×1

moops ×1

pyomo ×1

role ×1

types ×1