CHANGELOG v0.32.0
2019/12/11
[原文]
言語使用
真偽値として評価した際の否定を通常のメソッドと同様に expr.! と書けるようになった(#8445)
マクロ
マクロ内である型のクラスリスト一覧を取得する TypeNode#class_vars を追加(#8405)
あるモジュールを直接 include している型の一覧を取得する TypeNode#includers を追加(#8133)
ArrayLiteral#map_with_index と TupleLiteral#map_with_index を追加(#8049)
ArrayLiteral#reduce にドキュメントを追加(#8379)
StringLiteral#camelcase に 名前付き引数 lower: を追加(#8429)
標準ライブラリ
[破壊的変更] 標準ライブラリから Readline を取り除きいた。今後は crystal-lang/crystal-readline から shard として利用可能(#8364)
Number#clamp を Comparable#clamp へ変更(#8522)
引数なしで abort が呼べるようになった(#8214)
getter に絡んで Nil 制約に引っかかった際のエラーメッセージを改善(#8200、#8296)
Enum.valid? を追加(#5716)
環境変数が TERM=dumb である場合に、出力メッセージの色付けをしないように(#8271)
ドキュメントの改善(#7656、#8337、#8446)
仮メソッドについてのドキュメントを追加(#8327、#8491)
Object 型に定義されている !、as、as?、is_a?、nil?、responds_to? はコンパイラによって実装されていてオーバーライドできない、ということが明記されるようになった。
コードの掃除(#8270、#8368、#8404)
数値
型の最小値 に対して % や Int#remainder を -1 引数に実行した場合の処理を修正(#8321)
Int#gcd のレエアケース対応と性能改善(#7996、#8419)
整数値の指定された範囲のビットにアクセするための Int#bits を追加(#8165)
Number#round の引数に UInt を許可(#8361)
テキスト
[破壊的変更] 文字列リテラルの式展開を String.interpolation メソッドを呼ぶ方式に変更(#8400)
String.interpolation メソッドの実装を最適化することで、コンパイラを変更することなく式展開のパフォーマンス工場が図れる。
[破壊的変更] String#codepoint_at を廃止。 今後はchar_at(index).ord を使用(#8475)
musl iconv に絡んでエンコーディング周りの spec を修正(#8525)
String#presence を追加(#8345、#8508)
文字列が空だったら nil を返し、そうでなければ自分自身を返すメソッド。
String#center を追加(#8557)
#rjust (右寄せ)や ljust(左寄せ)と同じように中央寄せした文字列を返す。
[性能改善] ASCII文字しか含まない場合の String#to_utf16 をリファクタ(#8526)
Levenshtein モジュールにドキュメントを追加#8386)
文字列同士の類似度(レーベンシュタイン距離)を計算できる。
Regex::Options にドキュメントを追加(#8448)
コレクション
[破壊的変更] Enumerable#grep を廃止。今後は Enumerable#select を使用。(#8452)
比較不能な要素を含む場合の Enumerable#minmax、#min、#max の挙動を修正(#8490)
そうした場合に ArgumentError が発生するようになった。
Hash#rehash の挙動を修正(#8450)
Array の範囲へ代入する際、代入先にインデックス範囲外が指定された際の挙動を修正(#8347)
代入先の範囲の先頭インデックスが配列のサイズと同じ場合を許容するように変更。
a = [0,1,2]
# a[3] は存在しないが指定可能
a[3..] = [3,4,5]
a #=> [0, 1, 2, 3, 4, 5]
String#[]? と Array#[]? に終端のない範囲オブジェクト(3.. とか)を指定可能に(#8567)
Hash#compare_by_identity と Set#compare_by_identity を追加(#8451)
キーや値の比較に #object_id を使用するようになる。
ブロック引数をタプルで渡す Enumerable#each_cons_pair と Iterator#cons_pair を追加(#8332)
タプルで渡されるため、ブロック引数を個別の変数で受けられる。(2要素ずつ取り出す場合だけ)
すべての map_with_index メソッドに offset 引数を追加(#8264)
[性能改善] Tuple#to_a を最適化(#8265)
Hash.merge!(other : Hash, &) にドキュメントを追加(#8380)
Hash.select にドキュメントを追加(#8391)
Enumerable.reduce にドキュメントとテストケースを追加(#8378)
直列化
[破壊的変更] XML::Reader#expand が展開できない場合に例外を出すようになり、これまでと同様の動作をする XML::Reader#expand? を導入(#8186)
JSON.mapping と YAML.mapping で Array や Hash が値の変換に使用するコンバータを指定できるようになった(#8156)
プロパティ値から型を選択するための use_json_discriminator と use_yaml_discriminator を追加(#8406)
Object.from_json と Object.from_yaml から返り血の型制約 self を除去(#8489)
ファイル
[破壊的変更] File.expand_path と Path#expand が標準ではホームディレクトリ(~)を展開しなくなり、必要であれば引数で明示する方式に変更された(#7903)
Path の #dirname、#each_part、#each_parent に関するバグを修正(#8415)
GZip::Reader と GZip::Writer が大きなデータサイズを扱えるよう修正(#8421)
File::Info#same_file? が 64bit inode 番号を使用するよう修正(#8355)
ネットワーク
Content-Type ヘッダが空の時に、HTTP::Response#mime_type が nil を返すよう修正(#8464)
SSL サーバが一方的に接続を終了した場合に対応できるよう修正(#8481)
HTTP::Client#write_timeout を追加(#8507)
.js の MIME タイプを text/javascript に変更し、image/webp を追加(#8342)
Websocket プロトコルの GUID 文字列をリファクタ(#8339)
暗号化
[破壊的変更] OpenSSL::DigestBase#base64digest が Base64.strict_encode を使用して改行を含まない結果を返すように変更(#8215)
並列/並行処理
Channel#send で送信に成功したにもかかわらず例外が発生することがあったのを修正(#8284)
Channel#close をスレッドセーフ化(#8249)
receive? が既に閉じられたチャンネルに対して使用された際の select の挙動を修正(#8304)
高速な Mutex 実装とポリシーチェックの追加(#8295、#8563)
[性能改善] Channel 内部実装のリファクタと最適化(#8322、#8497)
Channel#send と Channel#close にドキュメントを追加(#8356)
Thread#gc_thread_handler を Windows 対応(#8519)
システム
マルチスレッドモードでシグナルハンドラようのパイプを閉じないよう変更(#8465)
OpenBSDのスレッド初期化処理を修正(#8293)
Win32 向けにファイバを実装(#7995、#8513)
実行時
-Dgc_none -Dpreview_mt 使用時のファイバ初期化処理を修正(#8280)
GC のプロファイリングステータスとワーニングバインディングを追加(#8281)
callstack_spec をリファクタ(#8308、#8395)
スペック
--fail-fast の挙動を修正(#8453)
before, after、around フックを追加(#8302)
should_not be_nil などの返り値の型制約を追加(#8412)
--order random|<seed-value> を指定することでスペックの評価順をランダム化できるようになった(#8310)
Spec フィルタの spec を追加(#8242)
spec にタグ付できるようになった(#8068)
タグを指定して特定の spec だけを実行することが可能。
コンパイラ
musl の libc 検索を修正(Alpine 3.10 のバグ対応)(#8330)
マクロ内でのプラグマ処理を修正(#8256)
‘alias Foo?’ でパーサがクラッシュするのを修正(#8282)
とじ括弧の前に改行があるとパーサエラーが発生していたのを修正(#8320)
ジェネリック型のサブタイプが特定の状況で no target defs エラーを引き起こすのを修正(#8417)
マクロが認識可能なローカル変数のクリーンアップを修正(#8529)
LLVM 9 サポートを追加(#8358)
コンパイラに --mcmodel オプションを追加(#8363)
ユニオン型で instance_sizeof を使用不可に(#8399)
ヘルプ内で crystal <command> --help に言及(#3628)
ファイル名をスペルミスした際のエラ〜メッセージを改善(#8500)
ローカルでコンパイルされた Crystal のフルパスを表示するように(#8486)
コード整理(#8460)
言語仕様
ユニオン型の alias が使用された際のメソッド検索優先度を修正(#8258)
仮想型のアクセス修飾子の挙動を修正(#8562)
sizeof(Bool) の挙動を修正(#8273)
これまで 0 が返されていたものが 1 を返すようになった。
電柱商事