如何使用块实例化对象?

时间:2013-05-16 10:58:22

标签: ruby

我想实现这样的目标:

object = SomeObj.new do
  instancevar = "value"
  anotherone  = "valuenew"
end

object.instancevar => "value"

但我不知道如何设计初始化方法,我有这样的东西:

class Klass 
  def initialize(info = {})
    info[:property] = "value"
  end
end

我想在构造函数中传递一些哈希来设置实例变量,但我也想提供实例化的块,但不知道如何实现这一点。

3 个答案:

答案 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