Какие модули Perl полезны для проверки аргументов подпрограммы?

С точки зрения того, как это реализовано, это изменяется метод - от OrderBy/ThenBy до OrderByDescending/ThenByDescending. Однако можно применить вид отдельно к основному запросу...

var qry = from .... // or just dataList.AsEnumerable()/AsQueryable()

if(sortAscending) {
    qry = qry.OrderBy(x=>x.Property);
} else {
    qry = qry.OrderByDescending(x=>x.Property);
}

Какое-либо использование? Можно создать весь "порядок" динамично, но он более включен...

Другой прием (главным образом соответствующий LINQ к объектам) должен использовать множитель-1/1. Это только действительно полезно для числовых данных, но является развязным способом достигнуть того же результата.

10
задан Brad Gilbert 16 September 2009 в 14:36
поделиться

2 ответа

Если вы начнете использовать Moose , вы найдете MooseX :: Types по своему вкусу. Типы автоматически имеют is_ $ type () и to_ $ type (). Это сделано для того, чтобы убедиться, что вы вводите ограничения типа проходов или чтобы ваш ввод имел допустимое принуждение к типу. Мне они больше нравятся даже для таких вещей, потому что вы можете гарантировать, что состояние вашего объекта имеет указанные типы без каких-либо дополнительных затрат.

use Moose;
has 'foo' => ( isa => MyType, is => ro );

sub _check_my_type {
  my ( $self, $type ) = @_;
  is_MyType( $type );
};

Возможно, не хватает некоторой поддержки глубоких / рекурсивных типов, но если вы используете этот материал в современный Perl вы, вероятно, "делаете это неправильно". Вместо этого используйте объект, у которого есть собственные проверки согласованности (например, мой выше с MyType), и просто передайте объект.

6
ответ дан 3 December 2019 в 23:50
поделиться

Have a look at MooseX::Method::Signatures which provides a bit more than just validating the arguments.

Example from POD:

package Foo;

use Moose;
use MooseX::Method::Signatures;

method morning (Str $name) {
    $self->say("Good morning ${name}!");
}

method hello (Str :$who, Int :$age where { $_ > 0 }) {
    $self->say("Hello ${who}, I am ${age} years old!");
}

method greet (Str $name, Bool :$excited = 0) {
    if ($excited) {
        $self->say("GREETINGS ${name}!");
    }
    else {
        $self->say("Hi ${name}!");
    }
}

MooseX::Method::Signatures also comes as standard with MooseX::Declare which brings even more sexy syntax to the Perl plate. The above could be written like so (just showing first method for brevity):

use MooseX::Declare;

class Foo {

    method morning (Str $name) {
        $self->say("Good morning ${name}!");
    }
}

There is also a corollary signatures CPAN module for plain subroutines but unfortunately it isn't as feature rich as above.

5
ответ дан 3 December 2019 в 23:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: