我开始学习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()
第一个版本如何“更好”或更清晰?
答案 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)
块的真正好处是它们允许您将代码作为参数传递。您将要执行的操作提供给方法,并且在某些时候该方法将执行您的块。当发生这种情况时,之前和之后发生的事情都是由您封装的,您只需要关注您为该方法提供的代码。
是否有可能以另一种方式完成的情况?也许,但是你对该块进行改进的类更改,你不需要担心它或采取额外的操作,因为它们是封装的,你只需要关注块代码。