Ruby中的块是否过度使用?

时间:2012-06-06 17:10:38

标签: ruby-on-rails ruby

我开始学习Ruby,而且可能毫无疑问最困难的事情就是阻塞我。

看一些他们使用的例子,其中一些似乎是不必要的复杂,几乎就像某人试图混淆代码。

例如,这里有一些来自Rails的迁移代码:

create_table :posts do |t|
    t.string :name
    t.string :title
    t.text :content
    t.timestamps
end

假设 t 指的是创建的表与这个不一样吗?:(添加括号使其更清晰)

t = create_table(:posts)
t.string(:name)
t.string(:title)
t.text(:content)
t.timestamps()

第一个版本如何“更好”或更清晰?

4 个答案:

答案 0 :(得分:6)

翻转您的问题:第一个版本的复杂程度如何?

简短回答:总的来说,没有。块用于特定目的。

IMO该块更具沟通性,因为:

  • 块中的所有内容都是相关的
  • 范围在语言级别强制执行(阻止后不再t

块也可以在方法yield之前或之后执行代码。例如,生成文件的块可以关闭文件。

那些添加的括号没有更清楚:Ruby(和类似语言)的优点之一是可选括号使事物看起来更具说明性,表定义是。

答案 1 :(得分:5)

使用块的一个原因是在块之后需要做的事情。

例如,假设需要调用一些名为now_commit_sql的私有迁移方法来实际提交SQL以创建posts表。在您列出的第二种方式中,由用户记住输入t.now_commit_sql()(除了必须公开的now_commit_sql方法之外)。

在块方式中,在yield之后,它可以单独调用,因此对于用户来说更加无缝且不易出错。此外,如果Rails开发人员需要在将来的版本中调用其他方法,例如log_sql()或者你有什么,他们可以将其粘贴在那里而不是用户现在必须知道调用{{1}除t.log_sql()之外。

答案 2 :(得分:0)

因为它是一个块,所以乍一看很清楚整个东西是相关的。在第二个例子中,你必须看两次。

答案 3 :(得分:0)

块的真正好处是它们允许您将代码作为参数传递。您将要执行的操作提供给方法,并且在某些时候该方法将执行您的块。当发生这种情况时,之前和之后发生的事情都是由您封装的,您只需要关注您为该方法提供的代码。

是否有可能以另一种方式完成的情况?也许,但是你对该块进行改进的类更改,你不需要担心它或采取额外的操作,因为它们是封装的,你只需要关注块代码。