Каково использование lvalue подпрограмм в Perl?

Вам нужно использовать отражение, чтобы начать использовать метод, а затем «построить» его, предоставив аргументы типа MakeGenericMethod :

MethodInfo method = typeof(Sample).GetMethod("GenericMethod");
MethodInfo generic = method.MakeGenericMethod(myType);
generic.Invoke(this, null);

. Для статического метода, pass null в качестве первого аргумента Invoke. Это не имеет никакого отношения к универсальным методам - ​​это просто нормальное отражение.

Как уже отмечалось, многое из этого проще с C # 4 с использованием dynamic - если вы можете использовать вывод типа, конечно. Это не помогает в случаях, когда вывод типа недоступен, например, точный пример в вопросе.

16
задан brian d foy 13 February 2009 в 07:20
поделиться

3 ответа

LValues рекомендуют избежаться. Они - забава и все, но они смущают новых пользователей, которые делают предположения о том, как работают все нижние индексы, и таким образом нужно избежать в коде, когда лучший путь доступен.

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

substr( $string, $start, $stop ) = 'somevalue' # replaces the specified part of the substring. 

Однако это также делает то же самое:

substr( $string, $start, $stop , 'somevalue' ); 

различие, здесь являющееся главным образом, первый имеет значительно более выразительную власть, поскольку это делегирует поведение к коду, который использует его вместо самой функции.

, Например:

substr( $string, $start, $stop ) =~ s/a/b/g 

потребовал бы, чтобы Вы сделали

my $x = substr( $string, $start, $stop ); 
$x =~ s/a/b/g/; 
substr( $string, $start, $stop, $x );

, Который немного противен.

, Хотя, существует дополнительное противное здесь, потому что необходимо думать о том, делать ли ли ту замену или нет с $x, работает задним числом для изменения строки или не (из-за substr быть LValue sub). Я не думаю, что это делает, но Его достаточно неоднозначное, которое я должен проверить руководство, чтобы помнить, делает ли это или нет, и это плохо.

14
ответ дан 30 November 2019 в 15:52
поделиться

Можно использовать lvalue нижние индексы в качестве методов set для элементов объекта:

sub x : lvalue {
    my $self = shift;
    $self->{x};
}

Затем позже:

$foo->x = 5;

Это комбинирует интуицию установки участников непосредственно с гибкостью инкапсуляции метода set, в случае, если Вы позже хотите измениться, как объект реализован. Сравните со следующими более традиционными путями к элементам множества в Perl:

Интуитивный, но хрупкий; что, если Вы изменяетесь, как $foo реализован?

$foo->{x} = 5;

Традиционный метод установщика; не использует синтаксис присвоения для какой суммы к присвоению:

$foo->set_x(5);

, Конечно, lvalue методы действительно никогда не охватывались сообществом Perl, и использование lvalue нижних индексов является "странным" и независимо от того, что было бы получено для интуиции, будет потерян странностью всего этого.

19
ответ дан 30 November 2019 в 15:52
поделиться

Они обеспечивают другой интерфейс, который при некоторых обстоятельствах может быть более интуитивным. В отличие от традиционных методов set, можно на самом деле изменить значение непосредственно. Например

lvalue_sub($foo) =~ s/foo/bar/;

может быть более чистым, чем

my $tmp = some_sub($foo);
$tmp =~ s/foo/bar/;
some_sub($foo, $tmp);
8
ответ дан 30 November 2019 в 15:52
поделиться
Другие вопросы по тегам:

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