QA@IT

Rubyで2バイト文字の文字列でもクラスとして定義されているか判別したい

3352 PV
Object.const_defined?("User") #=> true
Object.const_defined?("Person") #=> false

Module#const_defined?で指定した文字列がクラスとして定義されているか判別できると思うのですが、2バイト文字の場合、例外が発生してしまいます。引数に渡す文字列が動的に変わりうる場合、これが問題となってしまいます。

Object.const_defined?("ユーザー")
#=> NameError: wrong constant name ユーザー

2バイト文字かどうかにかかわらず、指定した文字列がクラスとして定義されているか判別するにはどうしたらいいでしょうか?

回答

2 バイト文字はクラス名になることはないので、
2 バイト文字であれば false とするのはどうでしょうか?

Rubyのクラス名は定数でないといけません。
定数は、アルファベット大文字 ([A-Z]) で始まらないといけないため、
2バイト文字はクラス名にすることはできません。

1.9.3p194 :001 > class あいう
SyntaxError: (irb):1: class/module name must be CONSTANT
編集 履歴 (0)
  • なるほど!`class_name.match(/^[A-Z]/) && Object.const_defined?(class_name)`などとすれば判別できそうですね。有難うございます。 -
  • 余談になりますが、Object.const_defined?(class_name)では、そのclass_nameがクラスなのかを判定するには不十分です。 -
  • Object.const_defined?で判定できるのは、その定数名が定義されているかどうかです。数値等のオブジェクトの入った定数の可能性もあります。ですので、一度その定数にはいっているオブジェクトを取り出し、Classオブジェクトかどうかを確認したほうがよいと思います。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。