2020/12/10 今週の気になった bugs.ruby のチケット

内容は適当です。
今週と言っても今週みかけたチケットなだけでチケット自体は昔からあるやつもあります。
あくまでも『わたしが気になったチケット』で全ての bugs.ruby のチケットを載せているわけではありません。

[Feature #17361] lambda(&block) does not warn with lazy proc allocation

  • Ruby 3.0 から lambda(&block) を書き方をすると警告が出るようになる
def foo &block
  b = block
  lambda(&b)
end

block = proc {}
# warning: lambda without a literal block is deprecated; use the proc without lambda instead
lambda(&block)

# warning: lambda without a literal block is deprecated; use the proc without lambda instead
foo {}
block = proc {}
# lambda にしているのに lambda? は false を返す
p lambda(&block).lambda?
# => false
  • しかし、次のようにブロック引数を直接 lambda に渡した場合に警告がでない、という報告チケットになる
def foo &block
  # no warning
  lambda(&block)
end

foo {}
  • なぜ…

[Feature #17380] Useful include/prepend in refine

  • Refinements の制限として次のように refine で定義したメソッドを自身で呼び出した場合はエラーになる
module Code
  def recurse(value = nil)
    return value if value

    # このコンテキストでは using されてないので自身のメソッドも呼ぶことができない
    recurse(42) # => NoMethodError!!!
  end
end

module Extension
  refine Object do
    include Code
  end
end

using Extension
# using したコンテキストからは呼び出すことができる
:x.recurse(:y) # => :y (ok)
:x.recurse     # => NoMethodError, was hoping for 42
  • これを緩和しないか、という旨のチケット
  • 確かにこれは直感的ではないんだけどこれを許容するとなんかいろいろとぶっ壊れる気がするんだよなぁ…
  • このあたりの挙動はなんかいい感じにしたいと思いつついい考えが浮かばない…

[Bug #17377] A warning message doesn't display using -W option on irb

  • irb-W を渡しても deprecated wanirng が出ない、というバグ報告
# ruby コマンドで -W を付けると警告が出る
$ ruby -W -e "Object.tainted?"
-e:1: warning: Object#tainted? is deprecated and will be removed in Ruby 3.2
# しかし irb だと -W を付けても警告が出ない
$ irb -W
irb(main):001:0> Object.tainted?
= > false

[PR #3867] Make ruby -We the same as ruby -W -e

  • -W-e を一緒にした -We オプションを追加する PR
ruby -W -e "p Warning[:deprecated]"
true

Ruby のマスターブランチで Rails の CI がぶっ壊れていたのが対処された