電柱商事

CHANGELOG v0.32.0

2019/12/11

[原文]

言語使用

真偽値として評価した際の否定を通常のメソッドと同様に expr.! と書けるようになった(#8445

マクロ

マクロ内である型のクラスリスト一覧を取得する TypeNode#class_vars を追加(#8405

あるモジュールを直接 include している型の一覧を取得する TypeNode#includers を追加(#8133

ArrayLiteral#map_with_indexTupleLiteral#map_with_index を追加(#8049

ArrayLiteral#reduce にドキュメントを追加(#8379

StringLiteral#camelcase に 名前付き引数 lower: を追加(#8429

標準ライブラリ

[破壊的変更] 標準ライブラリから Readline を取り除きいた。今後は crystal-lang/crystal-readline から shard として利用可能(#8364

Number#clampComparable#clamp へ変更(#8522

引数なしで abort が呼べるようになった(#8214

getter に絡んで Nil 制約に引っかかった際のエラーメッセージを改善(#8200#8296

Enum.valid? を追加(#5716

環境変数が TERM=dumb である場合に、出力メッセージの色付けをしないように(#8271

ドキュメントの改善(#7656#8337#8446

仮メソッドについてのドキュメントを追加(#8327#8491

Object 型に定義されている !asas?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_identitySet#compare_by_identity を追加(#8451

キーや値の比較に #object_id を使用するようになる。

ブロック引数をタプルで渡す Enumerable#each_cons_pairIterator#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.mappingYAML.mappingArrayHash が値の変換に使用するコンバータを指定できるようになった(#8156

プロパティ値から型を選択するための use_json_discriminatoruse_yaml_discriminator を追加(#8406

Object.from_jsonObject.from_yaml から返り血の型制約 self を除去(#8489

ファイル

[破壊的変更] File.expand_pathPath#expand が標準ではホームディレクトリ(~)を展開しなくなり、必要であれば引数で明示する方式に変更された(#7903

Path#dirname#each_part#each_parent に関するバグを修正(#8415

GZip::ReaderGZip::Writer が大きなデータサイズを扱えるよう修正(#8421

File::Info#same_file? が 64bit inode 番号を使用するよう修正(#8355

ネットワーク

Content-Type ヘッダが空の時に、HTTP::Response#mime_typenil を返すよう修正(#8464

SSL サーバが一方的に接続を終了した場合に対応できるよう修正(#8481

HTTP::Client#write_timeout を追加(#8507

.js の MIME タイプを text/javascript に変更し、image/webp を追加(#8342

Websocket プロトコルの GUID 文字列をリファクタ(#8339

暗号化

[破壊的変更] OpenSSL::DigestBase#base64digestBase64.strict_encode を使用して改行を含まない結果を返すように変更(#8215

並列/並行処理

Channel#send で送信に成功したにもかかわらず例外が発生することがあったのを修正(#8284

Channel#close をスレッドセーフ化(#8249

receive? が既に閉じられたチャンネルに対して使用された際の select の挙動を修正(#8304

高速な Mutex 実装とポリシーチェックの追加(#8295#8563

[性能改善] Channel 内部実装のリファクタと最適化(#8322#8497

Channel#sendChannel#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, afteraround フックを追加(#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 を返すようになった。

ツール

フォーマッタ

引数のインデントを修正(#8315

ジェネリック型の括弧に起因するクラッシュを修正(#8501

ドキュメント生成

_ を使用した型制約に関するドキュメント生成を修正(#8331

多重にマクロを呼び出した場合にドキュメントが正しく設定されるよう修正(#8502

定数に :ditto: が利用可能に(#8389

サイトマップ(sitemap.xml)生成機能を追加(#8348

仮メソッド !asnil? などのドキュメントを追加(#8327#8371

生成ドキュメントの見出し横にクリック可能なアンカーアイコンを追加(#8344

メソッド内で yield されるブロックの表示に &block ではなく & を使用するように(#8394

Playground

実行結果の表示中の空白文字を折り畳まないように変更(#8528

その他

CI の改善とお掃除(#8210#8251#8283#8439#8510

ベースの docker イメージを bionic と LLVM 8.0 に更新(#8442

リポジトリの掃除(#8312#8397