CHANGELOG v0.27.1
2019/01/30
[原文]
言語仕様
タプル型の表記内で、要素の末尾にカンマが置けるように(#7182)
{String, Int32, }
のように、要素の型リストがカンマで終わってもよくなり、マクロでタプルを生成する場合などに最後の要素かどうかを判定してカンマの有無を決める必要がなくなった。
標準ライブラリ
(性能改善) String
から UUID
の生成を最適化(#7030)
内部処理で Array
のかわりに Tuple
を使ったほか、入力バリデーションなどが最適化された。
(性能改善) SemanticVersion
処理を改善(#7234)
SemanticVersion
を class
から struct
に変更したほか、分岐条件などが最適化された。
Markdownのインラインコードがパースされてしまわないよう修正(#7090)
これまで、インラインコードの内部までMarkdownとしてパースされてしまい、 `#[](...)`
といったインスタンスメソッドに関する記述がリンク扱いになっていたのが修正された。
不適切な Time.now
の利用を修正(#7155)
経過時間を図る場合、タイムゾーンは不要なので、 Time.now
ではなく Time.utc_now
を使うよう修正された。
Nil#not_nil!
が NilAssertionError
を発生させるようになった(#7330)
これまで Exception
(全ての例外の基底クラス)が発生していたが、独自の型となったことで rescue
で拾いやすくなった。
SemanticVersion
のAPIドキュメントを追加(#7003)
Bool#to_unsafe
が C バインディングのためのものである旨をドキュメントに明記(#7320)
Class#to_s
で Class#name
を使用しないよう変更(#7295)
これまではある型 A
に対して、 A.name
をオーバーライドすると、 puts A
の結果が変化してしまっていた。
マクロ
ArrayLiteral#unshift
のドキュメントを修正(#7127)
Annotation#[]
がキーとして String
と Symbol
を受け取れるよう修正(#7153)
NamedTupleLiteral#[]
に不正な型のキーが与えられた場合コンパイルエラーとなるよう修正(#7158)
getter
/ property
マクロが Bool
型でも正しく動作するよう修正(#7313)
read_file
マクロメソッドを追加(#6967、#7094)
StringLiteral#count
メソッドを追加(#7239)
数値
BigDecimal
型の除算におけるスケール問題を修正(#7218)
String
型を Big〜
型のコンストラクタに渡す際にアンダースコアを使えるよう修正(#7107)
Complex
型に他の型への変換メソッドとそのドキュメントを追加(#5440)
Int128
と UInt128
型のSpecを追加(#7173)
安全でない数値の操作 value.to_X!
/ T.new!
/ Int#&**
を追加(#7226)
数値のオーバーフローチェックをオプトイン方式でプレビュー追加(#7206)
テキスト
ECR内のエラーで表示される箇所を修正(#7137)
ECRのドキュメントを追加(#7121)
String#to_i
が将来発生しうるオーバーフローを回避するよう変更(#7172)
コレクション
Hash#from
のドキュメントに登場する例を修正(#7210)
APIドキュメントの Enumerable#chunks
および Iterator#chunk
へのリンクを修正(#6941)
JSON
から Hash
への変換時に、暗黙のnullスキップを廃止(#7053)
これまでは、Hash.from_json
でJSONからハッシュを生成する際、JSON内で値が null
のアイテムは暗黙的に無視されていたが、値の型としてNil
を許容しないHash
の場合は例外となるようになった。
Iterator#slice_after
の追加(#7146)
Iterator#slice_before
の追加(#7152)
Iteratory#slice_when
および Iterator#chunk_while
の追加(#7159)
Enumerable#to_h(&block)
の追加(#7170)
Enumerable#one?
の追加(#7166)
Add several Enumerable, Iterator and Array overloads that accept a pattern(#7174)
ハッシュを生成するコンストラクタにドキュメントを追加(#6923)
シリアライズ
JSON
と YAML
を相互に変換するメソッドを追加(#7232)
JSON::Any
と YAML::Any
の間で #as_T
/ #as_T?
メソッドの挙動を標準化(#6556)
Set#from_yaml
を追加(#6310)
時刻/時間
Time::Span
のコンストラクタや、sleep
に大きな秒数を指定した際の挙動修正(#7221)
以前は、内部的に Int32
が使用されるタイミングがあり、Int32
に収まりきらない秒数が指定されるとオーバーフローを起こす可能性があった。
時刻のパースについてドキュメントを適正な形へ修正(#7035)
Float#weeks
が無かったので Int#weeks
と同様のメソッドとして追加(#7165)
ファイル
aarch64 環境で mkstemps
関数が使えるよう修正(#7300)
LibC の Error を spec 上で識別できるように(#7087)
標準ライブラリの多くは LibC の関数がエラーを返した際に Errno
型の例外を発生させるが、specによるテストでそうしたエラーを補足するには expect_raises(Errno, /***/) {...}
のような形でエラーメッセージから判別するしか無かった。今回、 expect_raises_errno
が追加されたことで、 expect_raises_errno(Errno::ENOENT) {...}
として個々のエラーを個別に捕捉できるようになった。
System::File.utime
がマイクロ秒精度を返すように変更(Unix)(#7156)
テンポラリファイルの spec に欠けていた後処理を追加(#7250)
ファイルを開く際のモードについてドキュメントを追加(#6664)
ネットワーク
HTTP::Client
の TLS 初期化中に例外が起きた際の処理を修正(#7123)
これまで、HTTPS通信を開始しようとしてTLSの初期化中にタイムアウトなどが発生すると、内部のソケットが OpenSSL::SSL::Socket::Client
ではなくコネクションが貼られた素の TCPSocket
となってしまい、その次のデータ送信に失敗する可能性があった。今回、そうした場合には次回の利用時に再度コネクションを貼り直すように修正された。
OpenSSL::SSL::Error.new
が Errno
を発生させないよう修正(#7068)
OpenSSL::SSL::Error.new
は内部で ssl_get_error
関数を使用しており、この関数内でsyscallエラーが起きた場合、これまでは Errno
型の例外が発生していた。今回、そうした場合も OpenSSL::SSL::Error
型の例外が返され、そこから ssl_get_error
内で起きたエラーも捕捉できるようになった。
StaticFileHandler::DirectoryListing
のURIエンコーディングを修正(#7072)
MIME
モジュールを追加(#5765、#7079、#7080)
ファイル名や拡張子からMIMEタイプをできるようになった。MIME::DEFAULT_TYPES
として標準で定義されているMIMEタイプはWeb関係でよく使われる10数種類だけだが、/etc/mime.types
や /etc/apache2/mime.types
などいくつかのファイルからMIMEタイプ定義の読み込みを試みるほか、自身で追加も可能。
MIMEタイプをパースするための MIME::MediaType
型を追加(#7077)
トップレベルタイプやサブタイプ、パラメータなどにアクセスできる。
HTTP::Server::Response
をステータスコード「100-continue」に対応(#6912)
ファイルディスクリプタからのソケット生成に対応(#6894)
OpenSSL
をSNIに対応(#7291)
HTTP::Server
のドキュメントを充実(#7251)
OpenSSL
のspecが想定外に失敗しないよう修正(#7202)
暗号化
OpenSSLが認証付き暗号に対応しているかを確認するための OpenSSL::Cipher#authenticated?
を追加(#7223)
システム
ARM環境でコンパイルする際のインラインアセンブラを修正(#7041)
Win32環境での Crystal::System
を充実(#6972)
Errno#errno_message
メソッドを追加(#6702)
これまで、Errno
型の例外を捕捉した際に strerror
関数が返すLibC側のエラーメッセージを単体で取得できなかったのができるようになった。
Spec
ネストしたit
やpending
ブロックを実行時に検出(#7297)
以前は it
の中に penging
を置けたりして色々面倒なことになっていたので、it
や penging
をネストできないようにした。
コンパイラ
LLVM::Type.const_int
の Int128
リテラルの処理方法を修正(#7135)
内部コンイパイラエラーに関連した名前付きタプルの修正(#7163)
トップレベルのプライベートメソッドの自動キャストが働いていなかったので修正(#7310)
v0.25.0で導入されたメソッドのリテラル引数を自動キャストしてくれる機能が、トップレベルのプライベートメソッドで働いていなかった。
列挙型(enum
)の定義内で initialize
を定義しようとした際に適切なエラーを返すようにして、代わりに Enum.new
の再定義を許可(#7266)
なお、実際には Enum.new
を再定義するのではなく、列挙型の定義内で self.new
を再定義する。再定義された A.new
が A
型を返す必要はない模様。
ユニオン型に対してインスタンス変数を取得しようとした際に適切なエラーを返すよう変更(#7194)
Crystal言語では、明示的なゲッタメソッドが定義されていないくても value.@var
という形でインスタンス変数を取得できる。
将来的には、ユニオン型を構成する全ての型が同じ名前のインスタンス変数を持っているのであれば、ユニオン型に対してもこの機能が利用できるようにする検討もされるようだが、現状ではユニオン型に対するこうしたインスタンス変数の取得はコンパイルエラーとなる。