使用块初始化有哪些优点?

5

有什么理由使用块初始化吗?例如:

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个回答

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时,尝试对块进行投资。

4
一项优点是它能明显地表明这些额外的操作是初始化操作。

1
在khell的回答基础上,块内创建的变量会在块外失去作用域,如果您不再使用它,则这是一件好事。

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行。

另外,看看这里的taphere。它有类似的好处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接