2015-12-29 3 views
2

Когда я пишу многострочный блок, который возвращает значение, мне нравится использовать фигурные скобки вместо do - end, чтобы сделать очевидным, что цель блока - вернуть вещи, в противоположность делать что-то.Разрешить скобки для блоков, которые возвращают

Стандартная конфигурация Rubocop не позволяет этого, и rubocop -a преобразует любой многострочный блок в блок do - end.

# I like but Rubocop hates. 
expect { 
    delete :destroy, id: thing.to_param 
}.to change(Thing, :count).by(-1) 

# I don't like but Rubocop does. 
expect do 
    delete :destroy, id: thing.to_param 
end.to change(Thing, :count).by(-1) 

# That, we both like. 
before do 
    stub_api_calls 
    admin_sign_in create(:super_admin) 
end 

Есть ли какой-либо параметр конфигурации в Rubocop, который допускает это различие?

Редактировать: Или, по крайней мере, это позволяет избежать изменения блока скобок, если после закрывающей скобки есть точка (.).

+2

Очевидно, что вы не можете позволить Rubocop различать, предназначен ли способ вернуть что-то или сделать что-то. Это скорее прагматично, чем семантично. Так что все, что вы можете сделать, это, по возможности, отключить предпочтение Rubocop 'do' ...' end' для многострочных блоков. – sawa

+0

Ну, что может легко реализовать Rubocop, если есть точка ('.') Сразу после закрывающей скобки. – Daniel

+0

Что делать, если блок является частью последнего выражения в определении метода? – sawa

ответ

0

Я обнаружил, что есть король по имени Style/BlockDelimiters, который делает трюк. Конфигурируется как semantic, он обеспечивает выполнение фигурных скобок вокруг функциональных блоков и делает .. по всему императивному коду.

Это то, что я добавил к .rubocop.yml:

# Allow curly braces for functional blocks 
BlockDelimiters: 
    EnforcedStyle: semantic 
Смежные вопросы