如何干掉Ruby初始化方法?

时间:2017-05-12 06:36:55

标签: ruby-on-rails ruby

在我的Rails应用程序中,我有这个类:

class Plan

  attr_reader :name, :id, :amount, :interval, :maximum, :features

  def initialize(id, name, amount, interval, maximum, features)
    @id = id
    @name = name
    @amount = amount
    @interval = interval
    @maximum = maximum
    @features = features
  end

  ...

end

有没有办法干掉这门课?

5 个答案:

答案 0 :(得分:7)

您可以在一行中完成:

def initialize(*args)
  @id, @name, @amount, @interval, @maximum, @features = args
end

答案 1 :(得分:2)

如果您不介意用 attr_accessor 替换 attr_reader ,那么您可以使用它,这将捕获创建新对象时可能提供的无效属性:

listOfCompany.Where(c=> c.id == 1).ToList().ForEach(cc => { cc.Name = "Whatever Name";cc.Contacts="Manager";});

答案 2 :(得分:2)

如果您不介意attr_accessor而不是attr_reader,那么您可以使用Struct。这正是它的作用:处理初始化程序中的所有样板。

Plan = Struct.new(:name, :id, :amount, :interval, :maximum, :features) do
  # def my_other_methods
  #   ...
  # end
end

plan = Plan.new('Joe', 1, 500)
plan.name # => "Joe"
plan.id # => 1
plan.amount # => 500
plan.interval # => nil

答案 3 :(得分:1)

怎么样:

def initialize(params = {})
  params.each{ |k,v| instance_variable_set("@#{k}", v)
end

答案 4 :(得分:1)

当我有两个以上带有这样的初始化器的类时,我通常会这样做:

# initialize.rb
module Initialize
  def initialize(params={})
    params.each do |attr, value|
      public_send("#{attr}=", value)
    end if params
  end
end

# plan.rb
class Plan

  include Initialize

  attr_accessor :name, :id, :amount, :interval, :maximum, :features

  def initialize(id:, name:, amount:, interval:, maximum:, features:)
    # some additional initialization code could go there
    super
  end
end

这样可以使单个setter进行额外的清理数据,你可以定义默认值,或者你可以委派一些setter。