【问题标题】:Raise ArgumentError if creating class object parameter hash did not met requirments引发创建类对象参数hash不符合要求的ArgumentError
【发布时间】:2014-11-10 14:14:47
【问题描述】:

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

如果我不想传递单独的参数,而是传递哈希,这里的最佳做法是什么?

类:

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"})

是否有一种铁路或更多红宝石的方式来实现我想要的,而不是迭代槽哈希并检查任何值是否为空以及计数是否小于或大于 2?

【问题讨论】:

    标签: ruby-on-rails ruby hash parameters


    【解决方案1】:

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

    此外,如果您想将哈希作为输入传递,请使用 Ruby OpenStruct 类。

    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
    

    【讨论】:

    • 不错的收获!添加到我的答案中
    【解决方案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
    

    正如blelump 指出的那样,这是创建类的更好方法:

    require 'ostruct'
    
    class MyClass < OpenStruct
    
      def valid?
        @table.length > 1 and !@table.value?(nil)   
      end
    
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-08
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      相关资源
      最近更新 更多