如何在Ruby中初始化块中的类?

时间:2012-03-22 16:10:12

标签: ruby

我无法弄清楚正确的块初始化

class Foo 
  attr_accessor :bar
end

obj = Foo.new do |a|
  a.bar = "baz"
end

puts obj.bar

期待“巴兹” 而不是

ruby​​中块类初始值设定项的正确含义是什么?

4 个答案:

答案 0 :(得分:29)

制作块初始化程序的另一种方法是自己编写一个:

class Foo
  attr_accessor :bar

  def initialize
    yield self if block_given?
  end
end

后来使用它:

foo = Foo.new do |f|
  f.bar = true
end

我的两分钱。

答案 1 :(得分:9)

再试一次:

class Foo 
  attr_accessor :bar
end

obj = Foo.new.tap do |a|
  a.bar = "baz"
end

puts obj.bar

答案 2 :(得分:2)

我认为new不能阻止它。无论如何都从未在任何地方看到它。为什么要在块中初始化?您总是可以obj = foo.new.tap do |a| ...如果您真的想要一个块

答案 3 :(得分:0)

实际上你有一个构造函数用于这些目的:

class Foo
  attr_accessor :bar

  def initialize(bar = "baz")
    @bar = bar
  end

end