Действительно ли возможно записать Java printf оператор, который печатает сам оператор?

Действительно ли возможно иметь Java printf оператор, вывод которого является самим оператором?

Некоторый отрывок для иллюстрирования:

// attempt #1
public class Main {
public static void main(String[] args) {

System.out.printf("something");

}
}

Это печатает something.

Таким образом, вывод попытки № 1 не совсем точно printf оператор в попытке № 1. Мы можем попробовать что-то вроде этого:

// attempt #2
public class Main {
public static void main(String[] args) {

System.out.printf("System.out.printf(\"something\");");

}
}

И теперь вывод System.out.printf("something");

Таким образом, теперь вывод попытки № 2 соответствует оператору в выводе № 1, но мы вернулись к проблеме, которую мы имели прежде, так как нам нужен вывод попытки № 2 для соответствия оператору в попытке № 2.

Так это возможный записать короткое printf оператор, который печатает себя?

5
задан polygenelubricants 22 May 2010 в 04:52
поделиться

2 ответа

Это некрасиво, но, безусловно, возможно:

public class Main {
public static void main(String[] args) {

System.out.printf("System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);",34,"System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);");

}
}

Вывод ( при запуске на ideone.com ):

System.out.printf("System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);",34,"System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);");

Этот вывод соответствует оператору printf .

Вероятно, будут более короткие решения.

См. Также

6
ответ дан 14 December 2019 в 04:31
поделиться

System.out - это статический экземпляр PrintStream, который можно заменить на любой PrintStream, добавив System.out.setOut(PrintStream s). Поэтому просто напишите подкласс PrintStream и переопределите необходимые методы. Ниже приведен очень простой пример для демонстрации. Рекомендуется переопределить больше методов.

    public class VerbosePrintStream extends PrintStream{

        public VerbosePrintStream (PrintStream ps){
            super(ps, true);
        }

        @Override
        public void println(String x) {
            super.println("System.out.println(\""+x + "\");");
        }

    }

Теперь протестируем вышеуказанный класс:

VerbosePrintStream vps = new VerbosePrintStream(System.out);
    System.setOut(vps);
    System.out.println("test string");
2
ответ дан 14 December 2019 в 04:31
поделиться
Другие вопросы по тегам:

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