3

我开始学习 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

4 回答 4

6

翻转你的问题:第一个版本如何更复杂?

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

IMO 该块更具交流性,因为:

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

块也可以在方法的yield. 例如,产生文件的块可以关闭文件。

那些添加的括号并没有使任何事情变得更清楚:Ruby(和类似语言)的优点之一是可选括号使事情看起来更具声明性,这就是表定义。

于 2012-06-06T17:16:20.997 回答
5

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

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

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

于 2012-06-06T17:16:37.750 回答
0

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

有没有可以通过其他方式完成的情况?也许吧,但是你根据块改变的类,你不需要担心它或采取额外的行动,因为它们是封装的,你只需要关心块代码。

于 2012-06-06T17:41:31.003 回答
0

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

于 2012-06-06T17:14:35.557 回答