2

我想实现这样的目标:

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

object.instancevar => "value"

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

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

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

4

3 回答 3

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它将是一个局部变量。

于 2013-05-16T11:00:32.110 回答
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"

优点:不需要特殊的构造函数

于 2013-05-16T11:09:08.220 回答
3

在您可以在此处安装的Ruby 2.x 中,您可以执行以下操作:

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
于 2013-05-16T13:06:33.457 回答