class Foo
attr_accessor :name, :age, :email, :gender, :height
def initalize params
@name = params[:name]
@age = params[:age]
@email = params[:email]
.
.
.
end这似乎是一种愚蠢的做法。在Ruby中初始化对象的更好/更习惯的方式是什么?
Ruby 1.9.3
发布于 2012-10-07 03:20:03
def initialize(params)
params.each do |key, value|
instance_variable_set("@#{key}", value)
end
end发布于 2012-10-07 03:20:18
您可以遍历这些键并调用setter。我更喜欢这样,因为如果你传递了一个无效的密钥,它就会被捕获。
class Foo
attr_accessor :name, :age, :email, :gender, :height
def initialize params = {}
params.each { |key, value| send "#{key}=", value }
end
end
foo = Foo.new name: 'Josh', age: 456
foo.name # => "Josh"
foo.age # => 456
foo.email # => nil发布于 2015-04-15 05:59:33
为了利用Joshua Cheek的答案进行一些概括
module Initializable
def initialize(params = {})
params.each do |key, value|
setter = "#{key}="
send(setter, value) if respond_to?(setter.to_sym, false)
end
end
end
class Foo
include Initializable
attr_accessor :name, :age, :email, :gender, :height
end
Foo.new name: 'Josh', age: 456
=> #<Foo:0x007fdeac02ecb0 @name="Josh", @age=456>NB如果已经使用了初始化混合,并且我们需要自定义初始化,我们只需调用:
class Foo
include Initializable
attr_accessor :name, :age, :email, :gender, :height, :handler
def initialize(*)
super
self.handler = "#{self.name} #{self.age}"
end
end
Foo.new name: 'Josh', age: 45
=> #<Foo:0x007fe94c0446f0 @name="Josh", @age=45, @handler="Josh 45"> https://stackoverflow.com/questions/12763016
复制相似问题