今週の気になった bugs.ruby

内容は適当です。
今週と言っても今週みかけたチケットなだけでチケット自体は昔からあるやつもあります。

[Feature #17006] Let Kernel#Hash take a block to provide the default value

  • Hashdefault_proc を渡せるようにする提案
# 既存のコード
h = {a: 1, b: 2}
h.default_proc = ->(h, k){raise "Unknown key #{k}"}
h # => ...

Hash.new{|h, k| raise "Unknown key #{k}"}.merge({a: 1, b: 2})

# 提案
# 上記みたいなコードを以下のように書く
Hash({a: 1, b: 2}){|h, k| raise "Unknown key #{k}"}
  • 汎用的に利用できそう
  • 以下のようなヘルパメソッドを定義してみるのはどうか
{a: 1, b: 2}.default_proc! { |h, k| raise "Unknown key #{k}" }
# => {a: 1, b: 2}

[Feature #17016] Enumerable#scan_left

  • Enumerable#scan_left を追加する提案
  • #scan_left#inject に似ているが結果を配列で返す
# inject は最後の結果だけ返す
[1, 2, 3].inject(0, &:+)    # => 6

# scan_left は過程の値を配列として返す
[1, 2, 3].scan_left(0, &:+) # => [0, 1, 3, 6]
module Enumerable
  def scan_left(init = shift, &block)
    inject([init]) { |a, e| a << (block.call a.last, e) }
  end
end

# 4312.to_s.chars.sort.join.to_i の呼び出し過程を計算したりとか…
p [4312, :to_s, :chars, :sort, :join, :to_i].scan_left(&:send)
# => [4312, "4312", ["4", "3", "1", "2"], ["1", "2", "3", "4"], "1234", 1234]
  • #inject#each_with_object でも似たような事ができるが、こちらは #lazy できないらしい
(1..).lazy.inject([0]){|a, e| a << a.last + e} # => infinite loop
(1..).lazy.each_with_object([0]){|e, a| a << a.last + e} # => infinite loop
(1..).lazy.scan_left(0, &:+) # => Lazy enumerator

[Feature #16923] Switch reserved for numbered parameter warning to SyntaxError

  • _1 = 42 を警告ではなくてシンタックスエラーにするチケット
    • 2.7 現在では _1 = 42 は警告になっている
  • これがマージされれば _1 = 42シンタックスエラーになる
  • もしかしたら 3.0 からシンタックスエラーになるかも?

[Misc #17019] DevelopersMeeting20200720Japan

  • 2020/07/20 に開発者会議を行う
  • 議論してほしいチケットがあれば登録してね

その他