2020/10/01 今週の気になった bugs.ruby のチケット
内容は適当です。
今週と言っても今週みかけたチケットなだけでチケット自体は昔からあるやつもあります。
[Bug #17190] Not working multiple assignment by rightward assignment statement
- 3.0 preview1 で
42, 42 => a, b
みたいな多重代入できないというバグ報告
# syntax error, unexpected ',', expecting end-of-input 42, 42 => a, b
a => b, c
や[1, 2] => a, b
は動作する- コメントでは
[42, 42] => a, b
を使うようにいわれている
[Bug #17193] Endless method definition doesn't work with lambdas in IRB
- irb で
def bar() = ->(x) { x * x }
がうまく動作しいないというバグ報告def bar() = ->(x) { x * x }
入力後に確定せずに次の行に移動する
- irb ではなくてファイル上のコードであれば問題なく動作する
[Feature #15815] Add option to raise NoMethodError for OpenStruct
OpenStruct
で存在しないキーにアクセスしたら例外が発生するようなオプションを追加する提案
# OpenStruct.new で exception: true を指定すると存在しないキーにアクセスしたら例外が出るようになる require 'ostruct' os = OpenStruct.new({a: 1}, exception: true) os.a #=> 1 os.b #=> NoMethodError
- これを
JSON.parse
で利用すると以下のような書き方になる
JSON.parse(response, object_class: Class.new(OpenStruct) { def initialize(hash); super(hash, exception: true); end })
- 今は
OpenStruct::Strict
というクラスを新しく追加する提案がされている
JSON.parse(response, object_class: OpenStruct::Strict)
- キーワード引数だと
JSON.parse
みたいなので使うのが難しかったりしたのでこれだとすっきり書けて便利そう
[Feature #15831] Add Array#extract
, Hash#extract
, and ENV.extract
#extract
を追加する提案- これは以下のように動作する
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # ブロックの条件に当てはまった要素をレシーバから取り除き # その取り除かれた要素を配列で返す odd_numbers = numbers.extract { |number| number.odd? } numbers # => [0, 2, 4, 6, 8] odd_numbers # => [1, 3, 5, 7, 9] # Hash の場合は Hash を返す h = {a: 100, b: 200, c: 300} extracts = h.extract {|k, v| v > 150} h # => {:a=>100} extracts # => {:b=>200, :c=>300}
- 機能自体は便利そう
!
がついてないのにレシーバを変更するのは個人的にはもにょる- ActiveSupport では
#extract!
という名前のメソッドで存在する - https://api.rubyonrails.org/classes/Array.html#method-i-extract-21
- ActiveSupport では
- 現時点では名前の競合とユースケースがないという理由で Reject されている
- その後、提示されたユースケースだと
#partition
の代わりに利用する例が上げられている
- default_specs, list = list.partition do |spec| - spec.default_gem? - end + default_specs = list.extract {|spec| spec.default_gem?}
- この例だけ見ると別に
#partition
でもいいじゃん、と思わなくもない
[Bug #15712] DateTime#=== should be defined and compare date and time instead of just the date
DateTime#===
で比較する際に時間を考慮せずに比較されているというバグ報告
require "date" dt1 = DateTime.new(2001, 2, 3) dt2 = DateTime.new(2001, 2, 3, 12) # #== は DateTime で再定義されているので時間まで見る p dt1 == dt2 # => false # #=== は Date#=== を使用するので時間の部分を無視して比較される p dt1 === dt2 #=> true
- 実際これはバグだが
DateTime
自体が非推奨の機能なので互換性の意味で現状のままになる - ドキュメントに
DateTime class is considered deprecated. Use Time class.
という一言が追加された
merge, fix されたチケット
- [Feature #15504] Freeze all Range objects
- Range リテラルで定義されたオブジェクトを freeze する機能の実装