Могу ли я сообщить или намекнуть RubyMine, какого типа локальная переменная или переменная экземпляра?

Я пытаюсь использовать быстрые документы RubyMine и завершение кода. Я был рад обнаружить, насколько хорошо он интегрировал комментарии в стиле YARD:

# @param [Numeric] width
# @param [Array<String>] values
# @return [Widget]      
def foo(width, values)

... эти комментарии отлично подходят для параметров, возвращаемых типов и даже типизированных коллекций. Но я не могу найти похожие теги, например, или локальные переменные, и я почти уверен, что в Ruby нет приведения типов (я упоминал, что я новичок в этом?)

Есть ли способ указать RubyMine на типы локальных переменных и/или переменных экземпляра?


person WiseOldDuck    schedule 26.05.2012    source источник


Ответы (3)


Судя по недавнему комментарию, опубликованному в системе отслеживания проблем, на которую ссылается Мэтт Коннолли, это ожидается: http://youtrack.jetbrains.com/issue/RUBY-9142#comment=27-787975

"локальные переменные могут быть аннотированы с именем переменной или без него:"

# @type [String]
my_var = magic_method

# @type my_var [String]
my_var = magic_method

# @type [String] my_var
my_var = magic_method

# @type [String] my_var And some documentation is allowed
my_var = magic_method

"Также поддерживаются множественные назначения:"

# @type my_var [String] The first part
# @type other_var [Range] The second part
my_var, other_var = magic_method

"Но в случае множественного присваивания форма без имени var работать не будет (это спорно, но я склоняюсь к тому, что это может привести к некоторым ошибкам)

Также параметры блока можно аннотировать:"

method_with_block do
  # @type [String] param1
  # @type [Range] param2
  | param1, param2 |
  # some code...
end

«Следует отметить, что аннотации типов должны быть размещены после do или { и перед списком параметров блока, чтобы избежать вероятной двусмысленности. В случае однострочников это выглядит громоздко, но я не уверен, что они должны быть сильно аннотировано. В любом случае, любые предложения очень приветствуются».

person WiseOldDuck    schedule 22.08.2014
comment
Он не распознает @yield и @yieldparam? - person thomthom; 08.05.2015
comment
Хм... так что пока нет ничего для переменных экземпляра? - person Franklin Yu; 20.06.2016
comment
@FranklinYu Я так не думаю, но вы, конечно, можете создавать геттеры (и сеттеры), которые затем можно аннотировать как методы. - person WiseOldDuck; 21.06.2016
comment
Этот стиль блока нарушает руководство по стилю Rubocop, жалуясь на то, что: Выражение аргумента блока не находится на той же строке, что и начало блока. - person Quolonel Questions; 21.08.2017

Это не 100% ответ на этот конкретный вопрос, но может указать на другой полезный трюк.

В тестах я делаю так, чтобы обмануть RubyMine (5.0.2)

user = users(:normal) || User.new

поскольку с фикстурами я уверен, что пользователи (: first) вернут объект, а из-за Use.new - IDE считает, что это должен быть экземпляр пользователя.

person Grzegorz    schedule 07.04.2013
comment
блестящий. Это все, что я бы опубликовал, но для SO требуется минимум, поэтому у вас есть это пояснительное предложение. - person Joe; 17.03.2017

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

http://youtrack.jetbrains.com/issue/RUBY-9142

Обновить

Эта функция теперь поставляется с RubyMine 7.0 (Tsubaki) EAP (138.1968) и выше (но обратите внимание, что Rubymine 7.0 в настоящее время находится в EAP (то есть бета-версии), и всегда есть шанс, что это может не попасть в окончательный дистрибутив.)

person Matt Connolly    schedule 24.11.2012