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

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

[#3626] Add Ractor.receive and Ractor#receive and use them everywhere

GitHub - ruby/typeprof: An experimental type-level Ruby interpreter for testing and understanding Ruby code

  • これも bugs.ruby のチケットではない話
  • TypeProfiler が rubyリポジトリに移動して、TypeProf という名前に変わった
  • gem install typeprof でシュッとインストールできるようになった
  • gem install typeprof すると typeprof コマンドが使えるようになるのでシュッと試すことができる
    • e.g. typeprof app.rb

[Feature #17260] Promote pattern matching to official feature

  • Ruby 2.7 で実験的に入ったパターンマッチを正式に導入するチケット
  • またこのチケットでは以下のような 1行 の in を削除する内容も含まれている
    • 1行 in とは以下のように記述する事ができる構文
    • これは実質 JavaScript の分割代入のように使うことができた
user = { name: "homu", age: 14 }

case user
in { name:, age: }
  pp name
  pp age
end

# 上のコードを1行で書くことができた
user in { name:, age: }
pp name
pp age
  • 右代入でこの機能を実装する等、いろいろと懸念点があるので一旦この機能は削除する方向になっている
  • ちなみに即効で => での分割代入が実装されていたりする…

[Feature #16276] For consideration: "private do...end" / "protected do...end"

  • private にブロックを渡せるようにするチケット
class Foo

  # ...there may be prior old-school public/private/protected declarations...

  def method_at_whatever_traditional_ruby_protection_level_applies
    puts "I'm traditional"
  end

  private do
    def some_private_instance_method
      puts "I'm private"
    end

    def self.some_private_class_method
      puts "I'm also private - principle of least surprise"
    end

    NO_NEED_FOR_PRIVATE_CONSTANT_DECLARATIONS_EITHER = "private"
  end

  def another_method_at_whatever_traditional_ruby_protection_level_applies
    puts "I'm also traditional"
  end

end
  • 某勉強会で『 private のブロック内でインスタンスメソッドやクラスメソッド、定数なんかを定義したら private になってほしいよねー』という話をしていて読んでいた
class Foo
  private do
    # 以下が全部 private になってほしい
    def private_hoge
    end

    def self.private_foo
    end

    HOGE = "hoge"
  end
end
  • クラスメソッドなどを private にする場合は特異クラスで定義するしかないのでこういう記法でかけると嬉しい
    • 余談だが後から private メソッドを追加することを考えてクラスメソッドを定義するときは必ず class<<self する人もいるらしい
class Foo
  # private クラスメソッドを書く場合は class<<self みたいな書き方をする必要がある
  class <<self
    private
    def private_foo
    end
  end
end
class Foo
  Bar = proc do
    Baz = 1
    def foo
      Baz
    end
  end
end

class Bar
  private(&Foo::Bar)
end
  • ちょっと意味は違うがこういうコードを見ているとつらい気持ちになっている…

merge, fix されたチケット