@naonalu

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Dartのprint関数で改行しない方法は、ないのでしょうか?

解決したいこと

Dartのprint関数で改行しない方法は、ないのでしょうか。
ご教示ください。

標準出力に改行なしに出力するやり方自体は
後述の方法で、できてはいます。

知りたいのは、
標準出力に出力する関数で、
改行なしに出力する方法があるのか、
ないのかということになります。

よろしくお願い致します。

該当するソースコード

void main()
{
  print('123');
  print('456');
}

出力結果(改行が入ってしまっている)

123
456

とりあえずの対策コード

import 'Dart:io';
void main()
{
  stdout.write('123');
  stdout.write('456');
}

出力結果(意図通り)

123456

自分で試したこと

ネット上で「dust print 改行」で検索しました。
また公式ドキュメントも確認しました。
https://api.dart.dev/stable/2.15.1/dart-core/print.html

0 likes

3Answer

どうしても print() の挙動を変えたいなら、独自の print() を持ったゾーンを作ることで実現できます。 runZoned(() { ... }) 内の(間接的に呼ばれるものも含めた)すべての print() の挙動が変わるので行儀がいいとは言えませんが。

import 'dart:async';
import 'dart:io';

main() {
  print("ここは");
  print("改行される。");

  runZoned(() {
    print("ここは");
    print("改行されない。");
  }, zoneSpecification: ZoneSpecification(
    print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
      // ここではグローバル関数 print() の内部処理を差し替えられる。
      // print() に与えられた引数 line を改行なしで出力してやる:
      stdout.write(line);
    }
  ));

  print("ここも");
  print("改行される。");
}

出力:

ここは
改行される。
ここは改行されない。ここも
改行される。

参考: https://api.flutter.dev/flutter/dart-async/Zone/print.html

0Like

どうしてもstdoutを使いたくないのであれば、エスケープシーケンスを使えば無理矢理ですが見かけ上できなくはないです。
(実際は改行された後カーソル位置を移動しているだけです。)

void main() {
  const esc = '\x1b';
  const line = ['123', '456'];
  print('${line[0]}');
  print('${line[1]}');
  print('${line[0]}');
  print('$esc[A$esc[${line[0].length}C${line[1]}');
}
123
456
123456

0Like

@uasi 様、 @_y_s 様、
回答ありがとうございました。
やはり改行なしのprint文はないということですね。

何かDart開発者の意図を感じます。
個人的にはかなり残念な結果です。

Dartの使用用途がGUIアプリの作成だからでしょうか、
ネット上にこの件についての明確な情報がないのも
不思議な気がしました。

折角なので以下の記事を書こうと思います。

「Dartには改行しないprint文はない」

ありがとうございました。

0Like

Your answer might help someone💌