👌
[Feature #21000] 型チェック時に定数の読み込みを効率よくしたい提案
[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 XYZで
autoloadをスキップして
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?
がクラス/モジュールを返すようにするのが汎用性高そうではあるけど非互換になるのがどれだけ影響あるんですかねー
Discussion