我想实现这样的目标:
object = SomeObj.new do
instancevar = "value"
anotherone = "valuenew"
end
object.instancevar => "value"
但我不知道如何设计初始化方法,我有这样的东西:
class Klass
def initialize(info = {})
info[:property] = "value"
end
end
我想在构造函数中传递一些哈希来设置实例变量,但我也想提供实例化的块,但不知道如何实现这一点。
答案 0 :(得分:9)
轻松!您只需将对象生成块。参见:
class SomeObj
def initialize
yield self if block_given?
end
attr_accessor :instancevar, :anotherone
end
object = SomeObj.new do |so|
so.instancevar = "value"
so.anotherone = "valuenew"
end
object.instancevar # => "value"
您的问题中的确切语法是不可能的,因为instancevar
将是一个局部变量。
答案 1 :(得分:7)
Ruby 1.9+:您可以使用tap
这样的方法:
class SomeObj
attr_accessor :instancevar, :anotherone
end
obj = SomeObj.new.tap do |o|
o.instancevar = "value"
o.anotherone = "valuenew"
end
现在
obj.instancevar => "value"
优点:您不需要特殊的构造函数
答案 2 :(得分:3)
在Ruby 2.x中,which you can install here,你可以这样做:
class SomeObj
def initialize **named_parameters
named_parameters.each_pair { |symbol, value|
instance_variable_set "@#{symbol}", value
singleton_class.class_eval { attr_accessor symbol }
}
end
end
o = SomeObj.new( foo: 42, bar: 43 )
o.foo #=> 42
o.bar #=> 43