Ruby, предпочитайте {} doend для однострочных блоков. Но ошибка

У меня есть этот код в файле класса .rb:

field :user, Types::UserType do resolve ->(_obj, _args, ctx) { ctx[:user] } end

мне нужно удалить do и end из одной строки, используя, я думаю, {}.

[Style/BlockDelimiters] Prefer{...}overсделать...конецfor single-line blocks.

Но я не понимаю, почему он выдает эту ошибку:

[ruby] syntax error, unexpected '{', expecting '('
[ruby] syntax error, unexpected '}', expecting keyword_end

Рубокоп версия

$ rubocop -V
0.51.0 (using Parser 2.4.0.2, running on ruby 2.4.2 x64-mingw32)

person Community    schedule 28.12.2017    source источник
comment
«что мне нужно, так это удалить» — вам не нужно слепо следовать всему, что говорит rubocop в первую очередь. Если вы все еще хотите удовлетворить его, правильно управляйте приоритетом оператора, возможно, с круглыми скобками вокруг Types::UserType.   -  person Aleksei Matiushkin    schedule 28.12.2017
comment
@mudasobwa Я думаю, что это будет примерно во всем списке аргументов, например. field(:user, Types::UserType) do #etc что, как было сказано, он будет лучше читаться как 2 строки или с использованием более естественного синтаксиса встроенного блока.   -  person engineersmnky    schedule 28.12.2017
comment
@engineersmnky, что такое more natural inline block syntax?   -  person    schedule 28.12.2017
comment
См. комментарий @gabrielhilal. Более естественно (читай идиоматично) использовать фигурные скобки {...} для обозначения встроенного блока. Внутренний синтаксический анализатор не запрещает использование do...end в качестве встроенного блока, это просто обычно не считается правильным стилем.   -  person engineersmnky    schedule 28.12.2017


Ответы (1)


Чтобы успокоить Рубокопа, переключитесь на это:

field :user, Types::UserType do
  resolve ->(_obj, _args, ctx) { ctx[:user] }
end

Или это:

field(:user, Types::UserType) { resolve ->(_obj, _args, ctx) { ctx[:user] } }

Я бы сказал, что первое намного чище, чем второе, но решать вам.

person tadman    schedule 28.12.2017
comment
@engineersmnky Тогда я прав. Интересно, когда они это исправили. Предположительно 1.9. - person tadman; 28.12.2017
comment
@engineersmnky То же самое. Возможно, я путаю это с какой-то другой особенностью синтаксиса. Я обновил ответ. - person tadman; 28.12.2017
comment
Последнее недействительно на 2.4. - person ; 28.12.2017
comment
Это может быть связано с неоднозначностью привязки, где неясно, предоставляется ли этот блок Types::UserType или field. Я обновил его с допустимым синтаксисом. - person tadman; 28.12.2017