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

[Bug #17193] Endless method definition doesn't work with lambdas in IRB

  • irbdef 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 })
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}
- 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

merge, fix されたチケット