Метод / блок Create_table - PullRequest
       3

Метод / блок Create_table

3 голосов
/ 30 сентября 2011

Я пришел из java / c ++ фона и только начал изучать Ruby.У меня проблемы с пониманием блоков, прикрепленных к методам.Это метод, используемый для переноса базы данных.

create_table :model_names do |t|
    t.string :name
    t.string :address
    t.timestamps
end

Мой вопрос: когда я использую команду rake db: migrate.Вызывает ли это метод create_table и передает ему объект TableDefinition, который я беру как | t |и установить атрибуты этого объекта в моем блоке?

1 Ответ

2 голосов
/ 01 октября 2011

Когда вы передаете блок методу, как это имеет место в примере, приведенном здесь, это зависит от метода, чтобы решить, как и если этот блок используется. Вам нужно будет прочитать документацию и / или исходный код метода, чтобы понять, какие параметры понадобятся вашему блоку, если таковые имеются.

В случае 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...