Ruby on rails 如果创建类对象参数哈希不满足要求,则引发ArgumentError

Ruby on rails 如果创建类对象参数哈希不满足要求,则引发ArgumentError,ruby-on-rails,ruby,hash,parameters,Ruby On Rails,Ruby,Hash,Parameters,我有一个我解决不了的小问题。我有一个类,它是通过参数散列传递给它的,但是如果参数计数小于或大于2,并且如果任何值为nill,我必须引发并出错 如果我不想传递单独的参数,而是散列,那么这里的最佳实践是什么 类别: Class MyClass attr_accessor :param1, :param2 def initialize(attr_hash) self.param1 = attr_hash[:param1].to_f self.param2 = attr_ha

我有一个我解决不了的小问题。我有一个类,它是通过参数散列传递给它的,但是如果参数计数小于或大于2,并且如果任何值为nill,我必须引发并出错

如果我不想传递单独的参数,而是散列,那么这里的最佳实践是什么

类别:

Class MyClass
  attr_accessor :param1, :param2

  def initialize(attr_hash)

    self.param1 = attr_hash[:param1].to_f
    self.param2 = attr_hash[:param2]

  end
end
我正在通过这样的事情

instance = MyClass.new({param1: 12, param2: "Ok"})

是否有一种轻率或更为ruby的方法来实现我想要的,而不是通过哈希迭代并检查任何值是否为空,以及计数是否小于或大于2

以下方法应该有效:

def initialize(hash)
  raise 'error' if hash.size < 2 or hash.value?(nil)
  self.param1 = hash[:param1].to_f
  self.param2 = hash[:param2]
end
def初始化(散列)
如果hash.size<2或hash.value?(nil),则引发“错误”
self.param1=散列[:param1]。到
self.param2=散列[:param2]
结束
如前所述,这是创建类的更好方法:

require 'ostruct'

class MyClass < OpenStruct

  def valid?
    @table.length > 1 and !@table.value?(nil)   
  end

end
需要“ostruct”
类MyClass1和@表1.价值?(无)
结束
结束

如果参数无效,请不要引发错误。相反,创建
valid?
实例方法来检查状态

另外,如果您想将散列作为输入传递,请使用Ruby类

require 'ostruct'

class MyClass < OpenStruct

  def valid?
    @table.length > 1    
  end

end

a = MyClass.new(a: :b, c: :d)
a.valid? # true
a.c # :d

a=MyClass.new(a: :b)
a.valid? # false
需要“ostruct”
类MyClass1
结束
结束
a=MyClass.new(a::b,c::d)
a、 有效吗真的
a、 c#:d
a=MyClass.new(a::b)
a、 有效吗假的

抓得好!补充我的答案