在我的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
有没有办法干掉这门课?
答案 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。