私が歌川です

@utgwkk が書いている

文字列を負の数回repeatしたときの言語ごとの挙動

プログラミング言語の組み込み関数・演算子・ライブラリで文字列を負の数回repeatしたときの挙動について調査した。空文字列になる場合と、例外を送出する場合と、コンパイルエラーになる場合に分かれている。

言語 (バージョン) コード 結果
D (dmd 2.076.0) "a".replicate(-1) OutOfMemoryError が送出された
replicateの引数はsize_t (unsigned)
引数がキャストされた結果巨大な文字列を生成しようとして落ちる
F# (fsharpc HEAD 10.1.2-24c798b) String.replicate -1 "a" System.ArgumentException: The input must be non-negative. が送出された
Go (1.12.8) strings.Repeat("a", -1) panic (negative Repeat count) になった
Haskell (ghc 8.4.2) concat $ replicate (-1) "a" "" に評価された
JavaScript (Node.js 8.12.0) "a".repeat(-1) RangeError: Invalid count value が送出された
PHP (7.3.3) str_repeat("a",-1) "" に評価された
警告が出る
Perl (5.22.1) "a" x -1 "" に評価された
use warnings してると警告が出る
Python (3.8.0) "a" * -1 "" に評価された
Ruby (2.6.1p33) "a" * -1 negative argument (ArgumentError) が送出された
Rust (1.18.0) "a".repeat(-1) コンパイルエラーになった
(繰り返し回数はusize)

文字列をrepeatするコードを書くときに予期しない例外送出の原因となってしまうことがあるので、みなさまにおかれましては気をつけましょう。

参考文献

文字列を負の数回repeatしたときの言語ごとの挙動 - 私が歌川です

JavaScriptはRangeErrorになります

2019/11/06 17:49
b.hatena.ne.jp

以上を受けてDのreplicateの引数に関する注釈を追加し、またJavaScriptの場合を追加しました。

情報提供を受けてF#の場合を追加しました。