Как я могу переопределить методы класса Perl?

попробуйте добавить dexOptions в ваш файл gradel, а также измените compileOptions

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.1"


    dexOptions {
        incremental true
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
13
задан Community 23 May 2017 в 10:31
поделиться

5 ответов

Можно перезаписать методы как get_val от другого пакета как это:

*{MyClass::get_val} = sub { return $some_cached_value };

Если у Вас есть список имен методов, Вы могли бы сделать что-то вроде этого:

my @methods = qw/ foo bar get_val /;
foreach my $meth ( @methods ) {
    my $method_name = 'MyClass::' . $meth;
    no strict 'refs';
    *{$method_name} = sub { return $some_cached_value };
}

Это то, что Вы воображаете?

16
ответ дан 1 December 2019 в 20:58
поделиться

Я пишу о нескольких разных вещах, Вы могли бы хотеть сделать в "Динамических Подпрограммах" главу Освоения Perl. В зависимости от того, что Вы делаете, Вы могли бы хотеть перенести подпрограмму или переопределить ее, или подкласс или все виды других вещей.

Perl динамический язык, таким образом, существует много черной магии, что можно сделать. Используя его мудро прием.

5
ответ дан 1 December 2019 в 20:58
поделиться

Я никогда не пробовал его методами, но Memoize может быть тем, что Вы ищете. Но обязательно считайте протесты.

3
ответ дан 1 December 2019 в 20:58
поделиться

Не полезный в Вашем случае, но имел Ваш класс, записанный у Американского лося затем, можно динамично переопределить методы с помощью его Класса:: основы MOP....

{
    package MyClass;
    use Moose;

    has 'val' => ( is => 'rw' );

    sub get_val {
        my $self = shift;
        return $self->val + 10;
    }

}

my $A = MyClass->new( val => 100 );
say 'A: before: ', $A->get_val;

$A->meta->remove_method( 'get_val' );
$A->meta->add_method( 'get_val', sub { $_[0]->val } );

say 'A: after: ', $A->get_val;

my $B = MyClass->new( val => 100 );
say 'B: after: ', $B->get_val;

# gives u...
# => A: before: 110
# => A: after: 100
# => B: after: 100
2
ответ дан 1 December 2019 в 20:58
поделиться

Как я изменяю, чтобы просто сделать это?:

cache_fn (\&myfn);

Хорошо на основе Вашего текущего примера Вы могли сделать что-то вроде этого....

sub cache_fn2 {
    my $fn_name = shift;
    no strict 'refs';
    no warnings 'redefine';

    my $cache_value = &{ $fn_name };
    *{ $fn_name } = sub { $cache_value };
}

cache_fn2( 'myfn' );

Однако смотря на этот пример я не могу сдержать взгляды, что Вы могли использовать Memoize вместо этого?

2
ответ дан 1 December 2019 в 20:58
поделиться
Другие вопросы по тегам:

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