Когда вы передаете блок методу, как это имеет место в примере, приведенном здесь, это зависит от метода, чтобы решить, как и если этот блок используется. Вам нужно будет прочитать документацию и / или исходный код метода, чтобы понять, какие параметры понадобятся вашему блоку, если таковые имеются.
В случае create_table
объект готовится и передается вам самим методом create_table
. rake
и связанная задача не имеет к этому никакого отношения, они используются только в качестве механизма запуска.
Важно помнить, что блоки Ruby могут называться ноль или более раз , либо сразу или в будущем . Это означает, что вы не можете быть уверены, будет ли ваш блок вызываться сразу, позже или никогда, или сколько раз он будет вызван. Единственное ожидание, которое вы можете получить, определяется методом, которому вы отправляете блок.
Вы можете даже передавать блоки методам, которые их не хотят, где ничего не произойдет, поскольку этот метод никогда не использует ваш блок с yield
.
Поначалу блоки могут быть немного запутанными, если вы не из языка, который имеет подобную конструкцию. Программисты JavaScript будут знакомы с передачей function
объектов, и это, в основном, все, что вы здесь делаете, хотя в терминах Ruby это Proc, который отправляется как неявный аргумент.
В примере с большим количеством JavaScript это будет выглядеть так:
create_table('model_names', function(t) {
t.string('name');
t.string('address');
t.timestamps();
});
В таком виде очевидно, что вы просто отправляете функцию, и ее выполнение зависит от функции create_table
. Ruby структурирован таким образом, что на первый взгляд может показаться, что блок выполняется сразу, но существует большая разница между объявлением блока с do ... end
и begin ... end
.