2

Rubyで定数を再定義すると(例FOO = 'bar')、警告が生成されますalready initialized constant

私はある種のReallyConstantsモジュールを書き込もうとしています。このコードは次のように動作するはずです。

ReallyConstants.define_constant(:FOO, 'bar') #=> sets the constant ReallyConstants::FOO to 'bar'
ReallyConstants::FOO #=> 'bar'
ReallyConstants::FOO = 'foobar' #=> this should raise an Exception

つまり、一定の再定義によって例外が生成されるはずです。

それは可能ですか?

4

1 に答える 1

4

モジュール内で定数のスコープを設定してから、モジュールのそれModule#freeze以上の変更を禁止するために使用します。

例えば

module Really
  CONSTANT = :foo
  freeze
end

Really::CONSTANT = :bar
-> RuntimeError: can't modify frozen Module

これは、定数に割り当てられた値の可変性を意味するものではないことに注意してください。そのためには、を使用しますObject#freeze

このアプローチは、Railsアプリケーションのように、コードがリロードされる環境であなたを苦しめます。そこで、追加のフープをジャンプして、モジュールを定義する前にモジュールがまだ定義されているかどうかを確認する必要があります。

一般的に、Rubyでの防御的なプログラミングは、その価値よりも厄介です。あなたの懸念は何ですか?

于 2011-11-05T17:47:28.587 に答える