【问题标题】:If I defined a Ruby method in IRB, how do I edit that method without retyping everything?如果我在 IRB 中定义了一个 Ruby 方法,如何在不重新输入所有内容的情况下编辑该方法?
【发布时间】:2012-03-12 22:58:59
【问题描述】:

假设我正在运行 IRB,我在控制台中输入:

def full_name(first, last)
   puts "Your full name is: #{first, ' ', last}"
end

假设我想编辑它以包含参数middle,我将如何恢复相同的方法并编辑参数列表并编辑puts 语句而无需重新键入整个方法?

附:我知道这个例子很简单,我可以很容易地重新输入方法,但是我正在尝试更大的方法,为了简洁起见,我使用这个简单的方法。

谢谢。

【问题讨论】:

  • 我认为这是不可能的。它只是一个解释器,逐行运行您的代码。

标签: ruby irb


【解决方案1】:

你不能。除了重新输入/重新粘贴它,或者按 来获取所有先前的语句,但是对于更长的方法,这可能会非常混乱。

为什么不在编辑器中输入代码,然后在 IRb 中输入load 'mycode.rb'?这基本上相当于复制并粘贴文本,然后再次调用load 'myfile.rb' 将像往常一样覆盖现有的方法定义。

或者,更好的是,使用 Pry 代替 IRB 作为 suggested by bannister below(我自己很久以前就完全用 Pry 替换了 IRB)。

【讨论】:

  • 这是完美的。一旦我进行更改并将其保存在我的文本编辑器中,是否有强制 IRB 重新加载我的文件?还是我必须“重新加载”它?
  • @marcamillion 我不知道,除非已经有 Gem 可以这样做,否则您可能必须对 IRb 进行猴子补丁才能执行此类操作。
  • @marcamillion:您可以使用类似在 GNU 屏幕会话中运行 IRB 并让您的编辑器在每次保存后注入代码的技巧。 People have done it.
  • @NiklasB。哇,这看起来很疯狂。我认为我在 IRb 中对大型函数做的事情还不够多,甚至都不想这样做。在 Vim 中运行 !ruby % 要容易得多 :)
  • @Andrew 您可能会注意到,在 IRB 中执行此操作有点尴尬;)请注意下面我的回答,了解如何在 Pry 中执行此操作,它自然支持这种事情 :)
【解决方案2】:

您可以在Pry(比 IRB 更强大的替代方案)中轻松完成此操作,只需使用edit-method 命令在编辑器中重新打开该方法,如下所示:

[19] (pry) main: 0> def full_name(first, last)
[19] (pry) main: 0*   puts "Your full name is: #{first + '' + last}"  
[19] (pry) main: 0* end  
=> nil
[20] (pry) main: 0> edit full_name
Waiting for Emacs...
=> nil
[21] (pry) main: 0> show-method full_name

From: (pry) @ line 32:
Number of lines: 3
Owner: Object
Visibility: public

def full_name(first, middle, last)
  puts "Your full name is: #{first + middle + last}"
end
[22] (pry) main: 0> full_name "Stephen ", "william ", "Hawking"
Your full name is: Stephen william Hawking
=> nil
[23] (pry) main: 0> 

编辑完成后pry会自动重新加载方法(编辑器pry使用的也可以是configured

【讨论】:

    【解决方案3】:

    我认为您在这里没有很多选择。我通常做的是将我正在玩的代码放在一个文件中,并在我更改某些内容时使用load '/path/to/file.rb' 重新加载它。

    您还可以尝试interactive_editor gem,它允许您使用成熟的文本编辑器在 IRB 会话中进行文本编辑。

    【讨论】:

    • +1 因为我们的答案基本相同,同时:)
    • @Niklas,对于自然支持这种东西的 IRB 的替代品(并且比 interactive_editor 更强大),请查看 Pry
    • @banister:我知道 pry,但它也不支持多行编辑。 edit-method 实际上不如 interactive_editor 方法有效,恕我直言
    • @Niklas interactive_editor 方法究竟如何更有效? :)。你也知道edit 命令吗?没有纯 readline 方法可以支持“真正的”多行编辑,但 pry 尽了最大可能,IMO。对于 OP 的特定问题,我相信edit-method 是最好的解决方案。
    • @banister:没有人提到 pure-readline。 zsh 和 IPython 设法提供真正的多行编辑,所以它至少是可能的。 rb-readline 理论上可以适应这样做。 interactive_editor 在我看来更有效一些,因为您不必提供方法名称。您只需打开编辑器并编辑要更改的任何类或函数,然后再次关闭编辑器。在 VIM 或 EMACS 中,我的工作速度非常快。
    【解决方案4】:

    查看pry gem - IRB 的绝佳替代品。此功能可能会有所帮助:

    • hist - 回放命令历史记录
    • amend-line - 在多行条目中更改一行

    pry wiki 上有详细记录

    【讨论】:

    • @Niklas 他不想“多行编辑”,他想重新编辑方法定义。 edit-method 让他这样做。这似乎正是他想要的。
    • @banister:我认为他真正想要的是类似于 zsh 或 IPython 的多行编辑,而不是使用外部编辑器。 IRB 和 Pry 都不支持这个(而且这个答案甚至没有提到edit-method,所以它不是很有帮助)。
    • @Niklas 您的解决方案也使用了外部编辑器。我的论点是edit-method 比更通用的“外部编辑器”解决方案更准确(关于问题)。此外,IPython(基于 readline)不再支持“多行编辑”——原因很简单,它不是真正的多行;它将多行压缩成一行,导航起来很尴尬。
    • @Niklas 我只给出了pry 的链接,因为它有很多很棒的文档。恕我直言,从其他资源复制粘贴内容是没有意义的。如果你查阅了 pry wiki,你会发现你错了(检查 histamend-line)。
    • @AleksanderPohl:我不知道amend-line,这是一个很棒的功能:) 感谢您指出。 (+1)
    【解决方案5】:

    您可以通过 irb 或 pry 进行编辑(我强烈推荐) - 但您需要重新输入整个内容。如果您考虑一下,键入一个方法并不难 :P 但是,如果您在一个类中包含多个方法,则重新键入整个类和相应的方法可能会非常乏味。在这种情况下你可以做的是使用 class_evals。

    Class Name
         def full_name(first, last)
           puts "Your full name is: #{first + ' ' + last}"
        end
    end
    
    # NEW Edited Code
    
    Name.class_eval do 
      def full_name(first, middle, last)
        puts "Your full name is: #{first + ' ' + middle + ' ' + last}"
      end 
    end
    

    Here's a good resource to read about re-opening classes/monkeypatchinghere's another that warns about the bad effects of monkeypatching

    【讨论】:

      【解决方案6】:

      从 Ruby 版本 2.7.0-preview1 开始,如果您按下 按钮,则可以在 IRB 会话中进行编辑:

      来源:https://www.ruby-lang.org/en/news/2019/05/30/ruby-2-7-0-preview1-released/

      【讨论】:

        猜你喜欢
        • 2023-03-11
        • 2022-01-08
        • 2010-12-19
        • 2012-09-09
        • 2015-09-06
        • 2013-07-04
        • 1970-01-01
        • 2011-05-20
        • 2021-10-31
        相关资源
        最近更新 更多