0

Ruby は初めてなので、ここで用語が間違っていたら申し訳ありません。

ハッシュのサブクラスを作成しようとしていますが、初期化に問題があります。既存のハッシュといくつかの追加パラメーターで初期化できるようにしたいです。

x = NewHash[{:a => b}, extra_param]

静的 Hash [] 演算子をオーバーライドして、それを実行しようとしました。

class NewHash < Hash
  def self.[](hash_values, backend = nil)
    @backend = backend
    super(hash_values)
  end
end

[] 演算子は静的であり、非静的メンバー変数にアクセスできないため、これは機能しません。つまり@backend、失われます。

何か私にできることはありますか?別の方法として を使用するnewこともできますが、それでは初期ハッシュを受け入れる良い方法が得られません。

4

1 に答える 1

1

[] はハッシュ コンストラクターではないため、これは少しハックです。それはファクトリーメソッドです。したがって、プライベート スコープを新しいハッシュに取得するための真にクリーンな方法はありません。

次のようなことができます。

class NewHash < Hash
  def self.[](hash_values, backend = nil)
    super(hash_values).tap do |hash|
      hash.instance_variable_set("@backend", backend)
    end
  end
end

これには、instance_variable_set一般的に臭いと考えられている を使用する必要がありますが、機能します。別の方法は、パブリック アクセサーを作成することです。

class NewHash < Hash
  attr_accessor :backend
  def self.[](hash_values, backend = nil)
    super(hash_values).tap do |hash|
      hash.backend = backend
    end
  end
end

もちろん、これは公開されているので、隠したい場合は、最初のほうが臭いかもしれません。

于 2013-06-13T11:53:12.047 に答える