创建数据库表的时候常常看到这样的代码
def self.up
create_table :products do |f|
t.string :title
t.text :decription
...........
end
end
但是看 rails 的源码,我并没有在 create_table 的函数里面看到有 yield
[:create_table, :create_join_table, :rename_table, :add_column, :remove_column,:rename_index, :rename_column, :add_index, :remove_index, :add_timestamps, :remove_timestamps,:change_column_default, :add_reference, :remove_reference, :transaction,:drop_join_table, :drop_table, :execute_block, :enable_extension,:change_column, :execute, :remove_columns, # irreversible methods need to be here too
].each do |method|
class_eval <<-EOV, __FILE__, __LINE__ + 1
def #{method}(*args, &block)
record(:"#{method}", args, &block)
end
EOV
end
def record(*command, &block)
if @reverting
@commands << inverse_of(*command, &block)
else
@commands << (command << block)
end
end
根据我的理解,代码块不是单独存在的,她出现在一个函数调用之后,如果这个函数不是迭代器,也没有 yield 来调用其后的代码,那么这个代码块会被忽略。但是她却没有被忽略。到底是什么原因呢?谢谢