Как должен подстрока () работа?

Тест для $this:

class Foo {

    function bar() {
        if (isset($this)) {
            echo "Y";
        } else {
            echo "N";
        }
    }
}

$f = new Foo();
$f->bar(); // prints "Y"

Foo::bar(); // prints "N"

Редактировать: Как указывает pygorex1, вы также можете принудительно метод, который будет оцениваться статически:

class Foo {

    static function bar() {
        if (isset($this)) {
            echo "Y";
        } else {
            echo "N";
        }
    }
}

$f = new Foo();
$f->bar(); // prints "N", not "Y"!

Foo::bar(); // prints "N"
7
задан skiphoppy 19 May 2009 в 17:22
поделиться

6 ответов

There are times when the second parameter being a length is more convenient, and there are times when the second parameter being the "offset to stop before" is more convenient. Likewise there are times when "if I give you something that's too big, just go to the end of the string" is convenient, and there are times when it indicates a bug and should really throw an exception.

The second parameter being a length is useful if you've got a fixed length of field. For instance:

// C#
String guid = fullString.Substring(offset, 36);

The second parameter being an offset is useful if you're going up to another delimited:

// Java
int nextColon = fullString.indexOf(':', start);
if (start == -1)
{
    // Handle error
}
else
{
    String value = fullString.substring(start, nextColon);
}

Typically, the one you want to use is the opposite to the one that's provided on your current platform, in my experience :)

9
ответ дан 6 December 2019 в 10:03
поделиться

Я привык к языкам, где substring () (или substr ()) занимает два параметры: начальная позиция и длина. Это объективно лучше чем способ, которым это делает Java, и если да, Вы можете это доказать?

Нет, объективно не лучше. Все зависит от контекста, в котором вы хотите его использовать. Если вы хотите извлечь подстроку определенной длины, это плохо, но если вы хотите извлечь подстроку, которая заканчивается, скажем, первым вхождением "." в строке это лучше, чем если бы вам сначала нужно было вычислить длину. Возникает вопрос: какое требование встречается чаще? Я бы сказал последнее. Конечно, лучшим решением было бы иметь обе версии в API, но если вам все время нужна версия, основанная на длине, использование статического служебного метода не так уж и ужасно.

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

5
ответ дан 6 December 2019 в 10:03
поделиться

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

1
ответ дан 6 December 2019 в 10:03
поделиться

второй параметр должен быть необязательным, первый параметр должен принимать отрицательные значения ..

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

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

public String skipsSubstring(String s, int index, int length) {
    return s.subString(index, index+length);
}
0
ответ дан 6 December 2019 в 10:03
поделиться

Получив некоторую обратную связь, я вижу, когда полезен сценарий второго параметра в качестве индекса, но до сих пор все эти сценарии, похоже, обходят другие ограничения языка / API. Например, API не предоставляет удобную процедуру для выдачи мне строк до и после первого двоеточия во входной строке, поэтому вместо этого я получаю индекс этой строки и вызываю substring (). (И это объясняет, почему второй параметр позиции в substr () превышает желаемый индекс на 1, ИМО.)

Мне кажется, что с более полным набором функций обработки строк в инструментарии языка второй параметр Сценарий -as-index проигрывает второму параметру по длине. Но кто-нибудь, пожалуйста, напишите мне контрпример. :)

1
ответ дан 6 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

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