11

設定されていない属性にアクセスしようとすると、OpenStruct のサブクラス (または任意のクラス)、またはハッシュがカスタム例外を発生させるようにする方法を見つけようとしています。define_methodこれを行うことができなかっmethod_missingたので、Rubyでどのように行うべきかわかりません。

次に例を示します。

class Request < OpenStruct...

request = Request.new

begin
  request.non_existent_attr
rescue CustomError...

私はそれが次のようなものでなければならないだろうと想像できました:

class Hash
  # if trying to access key:
  # 1) key exists, return key
  # 2) key doesn't exist, raise exception
end

編集:存在する属性は例外を発生させません。私が探している機能は、属性に自由にアクセスできるようにすることです。属性が存在しない場合は、カスタム例外が発生します。

4

6 に答える 6

10

厳密なハッシュが必要な場合は、次のようにします。

class StrictHash < Hash
  alias [] fetch
end

期待どおりに動作します:

hash = StrictHash[foo: "bar"]

hash[:foo]
# => "bar"

hash[:qux]
# stricthash.rb:7:in `fetch': key not found: :qux (KeyError)
#         from stricthash.rb:7:in `<main>'
于 2015-06-16T14:59:59.497 に答える
1

私はまさに私が必要とすることをするこのソリューションを使いました:

class Request < Hash
  class RequestError < StandardError; end
  class MissingAttributeError < RequestError; end

  def initialize(hash)
    hash.each do |key, value|
      self[key] = value
    end
  end

  def [](key)
    unless self.include?(key)
      raise MissingAttributeError.new("Attribute '#{key}' not found in request")
    end

    super
  end
end
于 2013-06-04T16:39:22.587 に答える