今週の気になった bugs.ruby
内容は適当です。
今週と言っても今週みかけたチケットなだけでチケット自体は昔からあるやつもあります。
[Feature #17006] Let Kernel#Hash
take a block to provide the default value
Hash
にdefault_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]
- Haskell や Scala に存在する関数らしい
- PR はちょっと前からあった
- 既存の実装だと
[1, 2, 3].inject([0]){|a, e| a << a.last + e}
みたいにかける - どういうときに利用するんだろう
- 累積和を求めるときに便利らしい
- 疑似実装
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
は警告になっている
- 2.7 現在では
- これがマージされれば
_1 = 42
はシンタックスエラーになる - もしかしたら 3.0 からシンタックスエラーになるかも?
[Misc #17019] DevelopersMeeting20200720Japan
- 2020/07/20 に開発者会議を行う
- 議論してほしいチケットがあれば登録してね