👌

[Feature #21000] 型チェック時に定数の読み込みを効率よくしたい提案

2025/01/04に公開

[Feature #21000] A way to avoid loading constant required by a type check

  • 次のように型チェックするようなコードをいい感じにかけるようにしたいというチケット
    • NameSpace::ClassName を重複しないで書きたい
# NameSpace::ClassName が存在しているときのみ右辺の #is_a? で型チェックする
if defined?(NameSpace::ClassName) and obj.is_a?(NameSpace::ClassName)
  • 個人的にはあんまりこういう書き方をみたことないんですがそれなりに存在しているみたいですね?
  • これに関していくつかの提案がされていますね
    • パターンマッチで obj in XYZ のときに XYZ が未定義の場合でも false を返す
    • obj in XYZ? みたいな新しいシンタックスを追加する
      • XYZ が未定義の場合は false を返す
    • autoload :XYZ, "xyz" があるときに obj in XYZautoloadをスキップしてfalse` を返す
    • defined?(XYZ)XYZ があったときの戻り値をそのクラス/モジュールにする
      • これにより以下のようにかけるようになる
        case obj
        when nil
        when defined?(XYZ)
        
        if obj and defined?(XYZ) === obj
        
        if defined?(Gem::Specification)&.respond_to?(:each)
        
      • 現状だと未定義の場合は nil が返ってきて、そうでない場合は `"constant" が返ってくる
        pp defined?(XYZ)    # => nil
        pp defined?(Array)  # => "constant"
        
  • 個人的には defined? がクラス/モジュールを返すようにするのが汎用性高そうではあるけど非互換になるのがどれだけ影響あるんですかねー
GitHubで編集を提案

Discussion