CHANGELOG v0.31.0
2019/09/23
[原文]
言語仕様変更
変数に拘束されないブロック引数の型制約が & : T -> U
の形式で可能に(#8117)
マクロ
@type
がマクロ内で実際の型を返すよう保証されるようになった(#8149)
標準ライブラリ
[破壊的変更] 標準ライブラリから Markdown
を除去(#8115)
[破壊的変更] OptionParser#parse!
は廃止予定となり、代わりに OptionParser#parse
を使用するように(#8041)
何箇所かのサンプルコードを修正(#8194)
数値
[破壊的変更] オーバーフローの発生が標準動作になった(#8170)
[破壊的変更] /
が全ての型で算術除算結果を返すようになった(#8120)
左辺が整数型であっても 3 / 2
は整数型の 1
ではなく浮動小数側の 1.5
が返される。以前の動作は //
で使用可能。
BigDecimal#**
と BigRational#**
を追加(#7860)
Number#round(digits, base)
メソッドでオーバーフローの発生を回避(#8204)
Int#divisible_by?
の挙動が明確になるようリファクタ(#8045)
テキスト
[性能改善] ASCII文字しか含まない場合の String#lchop?
について小規模な最適化(#8052)
コレクション
[性能改善] 要素数が少ない場合の配列処理を最適化(#8048)
[性能改善] Array#*
を最適化(#8087)
[性能改善] ハッシュにオープンアドレス法を採用(#8017、#8182)
[性能改善] Hash#to_a
、Hash#keys
、Hash#values
の最適化(#8042)
[性能改善] Hash#put
を追加し、Set#add?
を最適化(#8116)
Slice#==
の挙動を修正し, Slice#<=>
を追加(#8074)
同じインデックスの要素同士が別オブジェクトであっても同値とみなせる場合には、slice1 == slice2
が true
を返すようになった。
Iterator
のドキュメントに冪等性とめそっどの先行評価についての記述を追加(#8053)
Set#+
を追加(#8121)
Hash
の内部で整数除算が必要な場所で /
ではなく //
を使用するよう修正(#8104)
直列化
[破壊的変更] XML::Type
の名称を XML::Node::Type
へ変更し、XML::Reader::Type
を導入(#8134)
JSON と YAML における NamedTuple
の nilable なフィールドのパースを修正(#8109)
YAML でユニコード文字をそのまま使用するよう修正(#8132)
セクションを持たない INI
ファイルの生成を修正(#8106)
ファイル
[性能改善] 可能な場合に結合後の長さを事前に計算しておくように Path#join
を最適化(#8078)
[性能改善] 単独のパーツ同士を結合する場合の Path#join
の挙動を最適化(#8082)
[性能改善] Dir.glob
を最適化(#8081)
File.basename
の挙動を修正(#8119)
拡張子(第二引数)が指定された際、拡張子を除いたファイル名が1文字(a.txt
とか)だった場合に、拡張子を除去できていなかった。
Path.expand
における不要な Path.home
を除去(#8128)
STORED 時の Zip::Writer
の挙動を修正(#8142)
Deflate 圧縮を行わず、データをそのままZipファイルに追加する STORED 方式を使用した際に、圧縮済みバイト数と非圧縮バイト数のカウントが正しくなるように修正された模様。
ARGF が読み込みバイト数が 0 であることをチェックするよう修正(#8177)
読み込んでいるファイルの残りデータサイズが read バイト数より少ない場合におかしな挙動をしていたのが修正された。
ネットワーク
[破壊的変更] HTTP::Server::Response#respond_with_error
を #respond_with_status
に置き換え(#6988)
[破壊的変更] Handle too long URIs and too large header fields in HTTP::Request.from_io
が非常に長いURIや非常に大きなヘッダフィールドを扱えるようにして、HTTP::Request::BadRequest
を廃止(#8013)
ssl_accept
が失敗した際の SSL_new
のメモリリークを修正(#8088)
WebSocket が IPv6 接続する際のホスト処理を修正(#8066)
uri.host
は IPv6 アドレス指定時のブラケットがついたまま([::1]
)返されるため、ブラケットを除去(::1
)してくれる uri.hostname
を使うようになっている。
URI#query_params
メソッドを追加 (#8090)
URI#resolve
と URI#relativize
を追加(#7716)
HTTP::Cookies
に #clear
、#delete
、#size
の各メソッドを追加(#8107)
http/server_spec
をリファクタ(#8056)
UDP の spec をランダムばポートを使用するようにリファクタ(#8139)
並行処理
マルチスレッド対応(#8112)
ソースコードを -Dpreview_mt
付きでコンパイルするとマルチスレッドモードを利用可能。(【参照】Parallelism in Crystal)
マルチスレッドモードでのファイバスタックの解放を遅延させるようにした(#8138)
「マルチスレッドモードだと、ファイバスタックの再利用が現行ファイバの終了前に行われてしまう恐れがあるため」とのこと。
Crystal::Scheduler.init_workers
をワーカの準備が完了するまでブロックするようにした(#8145)
Crystal::ThreadLocalValue
をスレッドセーフにした(#8168)
スレッドローカルなデータ構造に exec_recursive
を使用するようにした(#8146)
Channel 関係のいくつかのメソドに返り値の型を明示した(#8161)
イベントループ実行専用のファイバを無くした(#8173)
スレッドリンクリストの破損を修正(#8196)
新しいスレッドがごく短時間で終了した際に、そのスレッドがリストに追加される前に削除処理が走ってしまうことがあってGCのエラーの元になっていたのが修正された、とのこと。
Win32 環境でファイバが実装されるまで、同環境でコンパイルする際の回避策を追加(#8195)
システム
Process.times
の制度を向上 (#8097)
スペック
[破壊的変更] focus
のサポートを追加. (#8125、#8178、#8208)
テストコードの discribe
、context
、it
に対して focus: true
を指定できるようになった。
いずれかの要素にこの指定がある場合、focus: true
指定されたテストだけが実行され、出力に「Only running focus: true
」というメッセージが追加される。
コンパイラ
内部関数宣言時のICEを修正(#8076)
いくつかの関数呼び出しで name_location
が欠けていたのを修正(#8192)
コンパイラのワーニング出力をデフォルド動作にした(#8171)
メソッド宣言と実際の返り値の型に齟齬がある場合のエラーメッセージを分かりやすく(#8203)
for
文のエラーをわかりやすく(#7641)
マクロの for
に未対応の型を指定した際のメッセージに、最近追加された型が載っていなかった。
セマンティクス
抽象メソッド宣言時のジェネリック側の継承関係チェックを修正(#8098)
Proc
型の型引数の仮想化が漏れていたのを修正(#8159)
例外処理の後で変数の型が正しくなくなるのを修正(#8037)
yield ノードが型を持たない場合の挙動を修正(#8101)
参照型の offsetof
の挙動を修正(#8137)
クロージャ内の rescue で例外を変数で受けられるよう修正(#8143)
クラス変数と定数の初期化をリファクタ(#8067、#8091)
クラス変数や定数が自身で初期化しようとした際、実行時エラーを出すようにした(#8172)
class Foo
@@bar : String = init
def self.init
@@bar = "a"
end
end
みたいなのは、@@bar
を @@bar
で初期化することになるため、これまではコンパイル時にクラッシュしていたが、今バージョンからそのことを実行時にエラーメッセージで指摘してくれるようになった。
ツール
ドキュメント生成
別クラスのコンストラクタへのリンクを修正(#8110)
同じメソッドの以前の定義時や、継承元クラスの定義時に指定されたドキュメントを再利用できるようになった(#6989)
ドキュメントコメントのないメソッド定義について、継承元の同名メソッドの定義時にドキュメントコメントがある場合、それより前の同名メソッドの定義時にドキュメントコメントがある場合などにそれらのドキュメントが再利用されるようになった。
# :ionherit:
を指定して、そうしたドキュメント内容の再利用を明示することもできる模様。
# :ionherit:
を使用せず、継承元の親クラスから自動的に引っ張ってこられた場合は、生成されたドキュメントにその旨記載される。