на CoCalc вы можете загрузить свой файл ipynb и сотрудничать с другими в режиме реального времени. Существует также способ публикации файлов в виде статических HTML-файлов, но вы также можете приглашать своих членов команды в свой проект и работать над файлом, пока они наблюдают за тем, что происходит. Существует также чат-чат, чтобы говорить о содержании.
Perhaps "%02d".format(5)
seems to imply that the object on which the format
method is being called is a format string.
In this case, the format string happens to also be a String
, so furthering that point, one could argue that all String
s are format strings.
Probably this can be avoided by saying that a static method in the String
class can be used to format a string, rather than making some implicit statement about all String
s in general.
Возможно, чтобы показать, что это «полезная» функция, которая существует для удобства, но на самом деле не является встроенной функцией String. То есть String "%02d"
- это способ представления формата, но на самом деле он не выполняет никакого форматирования.
Метод существует для удобного форматирования строк, но Formatter (который выполняет фактическое форматирование) также может форматировать другие типы объектов (дата и т. Д.).
«% 02d» .format (5) будет выглядеть так, как будто «% 02d» отформатирован с использованием формата 5, а не наоборот. Также большинство строк не подходят в качестве формата («hello world» .format (5)?), Поэтому метод должен выдавать исключения для большинства строковых объектов.
Хотя я не являюсь разработчиком Java, я могу сказать вам одну ясную причину для того, чтобы сделать его статичным.
В Java 5 было много функций, но две из них были следующими:
Хотя было бы неплохо иметь возможность сказать "bla: %d".format("foo"),
, сделав метод статичным, вы можете использовать форматирование таким способом, который очень знаком и понятен программистам на С, которые привыкли к printf()
.
import static java.lang.String.format;
public class Demo {
public void Test() {
//Do some stuff
format("Hey, this is easy to read!");
}
}
И вот почему! Используя статический импорт, printfs выглядят почти так же, как в C. Awesome!
В C # строки являются неизменяемыми . Я думаю, что это верно и для Java (не уверен на 100%). Таким образом, вы не изменяете строку, вызывая для нее метод форматирования, вы только возвращаете новую строку с форматированием. Это делает его методом уровня класса, а не методом уровня экземпляра, поэтому он является статическим. Вы можете добавить фасад уровня экземпляра в C #, используя функцию расширения, но это просто синтаксический сахар поверх статической функции.
Я думаю, что не обязательно, чтобы Java делала любую конструкцию, похожую на что-либо еще, даже C ++. Все, что принято, должно быть так, потому что разработчики принимают это. Кроме того, аргументы типа «они сделали его похожим на что-то другое» не объясняют, почему они не просто делают версию метода экземпляра, они делают это с помощью примитивных оболочек (в дополнение к методу toString () экземпляра у них есть статическая версия). ).
Это то, что я думаю:
В нормальном случае обе формы эквивалентны, но предположим, что у нас есть что-то вроде:
String invalidFormat = "%invalid"; // or something else that is invalid
, а затем мы вызываем:
String.format(invalidFormat, anything);
// "anything" is indeed anything....
недопустимый становится аргументом, а Java проясните это, бросив экземпляр IllegalArgumentException (даже в случае с Formatter, существует много видов).
Однако в чем-то вроде:
invalidFormat.format(anything);
недопустимый аргумент больше не является аргументом. Теперь проблема заключается в экземпляре, к которому он вызывается, и поэтому, вероятно, лучше описать его как «недопустимое состояние» (а не в «IllegalStateException» Java, который имеет совершенно другое использование). Но поскольку строки неизменяемы, это так называемое «состояние» никогда не изменится, поэтому оно всегда будет оставаться недопустимым как формат, даже если это допустимая простая строка.
Сравните это, скажем, с java.lang.Long. Обе версии toString никогда не вызовут никаких исключений, поэтому они оба эквивалентны.
даже если это допустимая простая строка.Сравните это, скажем, с java.lang.Long. Обе версии toString никогда не вызовут никаких исключений, поэтому они оба эквивалентны.
даже если это допустимая простая строка.Сравните это, скажем, с java.lang.Long. Обе версии toString никогда не вызовут никаких исключений, поэтому они оба эквивалентны.
Probably because String is immutable and therefore this method has to create and return a new instance of String instance. If the method was not declared static, you would probably expect it to modify the String instance on which it has been called.
Merely because the call is reminiscent of C's sprintf
function.
Ответ лежит на методе Format.
Более логично и интуитивно понятно, по крайней мере для меня, сказать, что «строка формата является входом для метода Format», чем сказать, что « Формат работает с форматной строкой ". Это так, поскольку мы «обычно» передаем форматированную строку, известную во время разработки, в Format. Напротив, для Trim мы «обычно» передаем переменную строку, значение которой неизвестно во время разработки.
Итак, делая метод форматирования статическим, сделайте чтение кода более интуитивным. Посмотрите на следующее (C #).
answer = String.Format("This is format string : {0}", someValue);
//More readable to me
answer = "This is format string : {0}".Format(someValue);
РЕДАКТИРОВАТЬ: Несмотря на то, что я использовал пример кода C #, это хорошо относится к Java. Я получил -ve голос за использование синтаксиса C #!
The main reason is probably that the designers of Java did not want to add too much stuff to the interface of String. Making it a member function would have meant putting it on string. Remember that a non-static method would have to be on the String object.
A second reason is that the static format maintains its resemblance to C's printf, which looks like printf(FORMAT, ARG1, ARG2...)
Another reason is that format is overloaded: there is a version that takes locale as the first parameter (before the string), so doing this on the string object would be tricky.
Вызов strfmt.format (objects) вместо String.format (strfmt, objects)
Я действительно думаю, что формат
должен быть методом экземпляра строки, и поэтому также делать
2.6: Печать «% s»% («Hello»)
3.0: Печать («{0}». Формат («Hello»))
2.7.6: PrintLN («% s» .Format («Hello»))