2

Ruby 1.8.7 にある Rails アプリでデコレーターとして実装されている特定のクラスがあります。警告が表示され続けます - warning: already initialized constant ABC。ここで、ABC は定数の名前です。

これを解決するために、const_defined?を使用しています。この回答で提案されている方法。

私の疑問はconst_defined?、クラス定数がすでにルビーで定義されているかどうかを確認する正しい方法ですか? モジュール定数のチェックに使用できることがはっきりとわかります。

この回答defined?で述べたように、この方法も使用できることがわかりました。のドキュメントを検索しようとしましたが、これまでの検索ではドキュメントへのリンクが見つかりません。defined?

現時点では明確な違いが見られないため、どちらを選択すればよいかわかりません。

この状況でどちらを使用するのが最適か、またその理由を教えてください。

4

3 に答える 3

1

もう1つのオプションがあります。これは、Ruby がこの厄介な#const_missingメソッドを持っているためです。このメソッドは、そこにある場合でも予期せず値を提供する可能性があり、false#const_defined?を示します。

module M
  def self.const_missing sym; 42 end
end

M.const_defined? "A" #=> false
M::A #=> 42

このような場合、次のbegin ... rescue ... endステートメントを使用できます。

begin
  M::A; true
rescue NameError
  false
end
#=> true
于 2014-09-01T15:56:25.407 に答える