プログラミング言語の組み込み関数・演算子・ライブラリで文字列を負の数回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するコードを書くときに予期しない例外送出の原因となってしまうことがあるので、みなさまにおかれましては気をつけましょう。
参考文献
- D: Function replicate - D Programming Language
- F#: String.replicate Function (F#)
- Go: strings - GoDoc
- Haskell: Prelude
- JavaScript: String.prototype.repeat() - JavaScript | MDN
- PHP: https://www.php.net/manual/ja/function.str-repeat.php
- Perl: perlop - Perl の演算子と優先順位 - perldoc.jp
- Python: 組み込み型 — Python 3.8.0 ドキュメント
- Ruby: class String (Ruby 2.6.0)
- Rust: std::string::String - Rust
dのarray.replicateもsize_t (unsigned)を繰り返し回数として受け取るので注釈お願いします
— gǔ yuè (@theoremoon) November 6, 2019
文字列を負の数回repeatしたときの言語ごとの挙動 - 私が歌川ですb.hatena.ne.jpJavaScriptはRangeErrorになります
2019/11/06 17:49
以上を受けてDのreplicateの引数に関する注釈を追加し、またJavaScriptの場合を追加しました。
情報提供を受けてF#の場合を追加しました。