Как я делаю строковую замену в функции PowerShell?

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

Если статические атрибуты получают экземпляр до того, как класс получает экземпляр через его конструктор, статические атрибуты внутри вложенных статических классов похоже, не создаются экземпляром до тех пор, пока не будет вызван конструктор класса или, по крайней мере, до тех пор, пока не будут указаны первые атрибуты, даже если они отмечены как «final».

Рассмотрим этот пример:

public class C0 {

    static C0 instance = null;

    // Uncomment the following line and a null pointer exception will be
    // generated before anything gets printed.
    //public static final String outerItem = instance.makeString(98.6);

    public C0() {
        instance = this;
    }

    public String makeString(int i) {
        return ((new Integer(i)).toString());
    }

    public String makeString(double d) {
        return ((new Double(d)).toString());
    }

    public static final class nested {
        public static final String innerItem = instance.makeString(42);
    }

    static public void main(String[] argv) {
        System.out.println("start");
        // Comment out this line and a null pointer exception will be
        // generated after "start" prints and before the following
        // try/catch block even gets entered.
        new C0();
        try {
            System.out.println("retrieve item: " + nested.innerItem);
        }
        catch (Exception e) {
            System.out.println("failed to retrieve item: " + e.toString());
        }
        System.out.println("finish");
    }
}

Хотя «вложенные» и «innerItem» объявляются как «статические окончательные». параметр nested.innerItem не выполняется до тех пор, пока не будет создан экземпляр класса (или, по крайней мере, до тех пор, пока не будет указан первый вложенный статический элемент), как вы можете убедиться сами, комментируя и раскомментируя строки, на которые я ссылаюсь, выше. То же самое не относится к «externalItem».

По крайней мере, это то, что я вижу в Java 6.0.

16
задан Peter Mortensen 13 July 2015 в 13:11
поделиться

4 ответа

Понятие здесь корректно.

проблема с именем переменной, которое Вы выбрали. $input является зарезервированной переменной, используемой PowerShell для представления массива конвейерного входа. Если Вы меняете свое имя переменной, у Вас не должно быть проблемы.

PowerShell действительно имеет оператор замены, таким образом, Вы могли превратить свою функцию в

function CleanUrl($url)
{
    return $url -replace 'http://'
}
16
ответ дан 30 November 2019 в 17:17
поделиться

Работы ответа Steve. Проблема с Вашей попыткой воспроизвести сценарий ESV состоит в том, что Вы используете $input, который является зарезервированной переменной (это автоматически собирается, несколько передали вход по каналу в единственную переменную).

необходимо, однако, использовать.Replace (), если Вам не нужна дополнительная функция (функции) - замена (это обрабатывает регулярные выражения, и т.д.).

function CleanUrl([string]$url)
{
    $url.Replace("http://","")
}

, Который будет работать, но так был бы:

function CleanUrl([string]$url)
{
    $url -replace "http://",""
}

кроме того, когда Вы вызываете функцию PowerShell, не используют круглую скобку:

$HostHeader = "http://google.com"
$SiteName = CleanUrl $HostHeader
Write-Host $SiteName

Hope, которая помогает. Между прочим, для демонстрации $input:

function CleanUrls
{
    $input -replace "http://",""
}

# Notice these are arrays ...
$HostHeaders = @("http://google.com","http://stackoverflow.com")
$SiteNames = $HostHeader | CleanUrls
Write-Output $SiteNames
16
ответ дан 30 November 2019 в 17:17
поделиться
function CleanUrl([string] $url)
{
    return $url.Replace("http://", "")
}
5
ответ дан 30 November 2019 в 17:17
поделиться

Это работало на меня:

function CleanUrl($input)
{
    return $input.Replace("http://", "")
}
-4
ответ дан 30 November 2019 в 17:17
поделиться
Другие вопросы по тегам:

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