【问题标题】:Can I tell or hint to RubyMine what type a local or instance variable is?我可以告诉或提示 RubyMine 本地变量或实例变量是什么类型吗?
【发布时间】:2012-06-01 21:57:54
【问题描述】:

我正在尝试利用 RubyMine 快速文档和代码完成功能。我很高兴地发现它与 YARD 风格的 cmets 的集成效果如何:

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

...这些 cmets 非常适合参数、返回类型,甚至是类型化的集合。但我找不到任何类似的标签,例如实例或局部变量,而且我很确定 Ruby 中没有可用的类型转换(我有没有提到我是新手?)

有没有办法让 RubyMine 了解本地和/或实例变量的类型?

【问题讨论】:

    标签: ruby rubymine


    【解决方案1】:

    根据最近发布到 Matt Connolly 引用的问题跟踪器的评论: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 name 的表单将不起作用(这是有争议的,但我倾向于它可能会导致一些错误)

    块参数也可以注释:"

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

    "需要注意的是,类型注释要放在 do 或 { 和块参数列表之前,以帮助避免可能的歧义。在单行的情况下,它看起来很麻烦,但我不确定它们是否需要大量注释。无论如何,任何建议都非常受欢迎。”

    【讨论】:

    • @yield@yieldparam 上没有收到吗?
    • 嗯...所以还没有任何实例变量?
    • @FranklinYu 我不这么认为,但您当然可以制作 getter(和 setter),然后您可以将其注释为方法。
    • 此块样式违反了 Rubocop 样式指南,抱怨:块参数表达式与块开始不在同一行。
    【解决方案2】:

    这不是这个特定问题的 100% 答案,但可以指出其他有用的技巧。

    在测试中我这样做是为了欺骗 RubyMine (5.0.2)

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

    因为有了固定装置,我确信 users(:first) 会返回对象,并且因为 Use.new - IDE 认为它应该是 User 实例。

    【讨论】:

      【解决方案3】:

      似乎没有。我建议在问题跟踪器中查找现有功能请求,并添加让您的声音在那里被听到。例如:

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

      更新

      此功能现在随 RubyMine 7.0 (Tsubaki) EAP (138.1968) 及更高版本一起提供(但请注意,Rubymine 7.0 目前处于 EAP(即测试版)中,并且总有可能无法进入最终发行版。)

      【讨论】: