使用块初始化有什么好处吗?

时间:2009-09-14 21:06:21

标签: ruby initialization

是否有任何理由使用块初始化,如下所示:

x = Observer.new do
  add_event(foo)
  some_other_instance_method_on_observer
  self.some_attribute = something
end

而不是在像这样的实例变量上使用点运算符初始化属性:

x = Observer.new
x.add_event(foo)
x.some_other_instance_method_on_observer
x.some_attribute = something

4 个答案:

答案 0 :(得分:5)

这里唯一的原因是拥有更简洁的代码(您不必在方法调用之前添加实例名称)。通过使用块,您可以编写非常简洁,可读和可读的代码。有时您可以为代码消费者节省大量的输入甚至代码逻辑。 这是一个传统的案例!

file = File.open("some_file.txt","w")
file << "more code"
file.close

将它与这个漂亮的块替代方案进行比较:

File.open("some_file.txt","w") { |file| file << "adding new stuff" }

它使用户免于必须打开和关闭(我亲自忘记这个)文件本身的麻烦。相反,它使他专注于他想要的东西。

尝试在这种情况下投资积木+当你想写出漂亮的DSL时。

答案 1 :(得分:4)

一个优点是,显而易见的是,这些附加操作是初始化操作。

答案 2 :(得分:1)

基于khell的答案,在块内创建的变量超出了块的范围,如果你不再使用它,这是一件好事。

答案 3 :(得分:0)

如果您的代码位于返回对象的方法中。比较

def create_observer
    Observer.new {|x| x.foo, x.bar = calculate_foo, calculate_bar }
end

def create_observer
    x = Observer.new
    x.foo = calculate_foo
    x.bar = calculate_bar
    x
end

因此,使用块可能允许您在一行中编写逻辑。 即使您在第二个示例中使用并行分配,仍然需要3行。

另外,请查看tap here。它有类似的好处。