在irb中定义一个名为“方法”的方法时,估计了错误的参数数目

问题描述

在irb / gry中定义一个名为“方法”的方法

def method
    puts 1
end
 Traceback (most recent call last):
        33: from F:/Ruby27-x64/bin/irb.cmd:31:in `<main>'
        32: from F:/Ruby27-x64/bin/irb.cmd:31:in `load'
        31: from F:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/irb-1.2.3/exe/irb:11:in `<top (required)>'
        30: from F:/Ruby27-x64/lib/ruby/2.7.0/irb.rb:399:in `start'
        29: from F:/Ruby27-x64/lib/ruby/2.7.0/irb.rb:470:in `run'
        28: from F:/Ruby27-x64/lib/ruby/2.7.0/irb.rb:470:in `catch'
        27: from F:/Ruby27-x64/lib/ruby/2.7.0/irb.rb:471:in `block in run'
        26: from F:/Ruby27-x64/lib/ruby/2.7.0/irb.rb:536:in `eval_input'
        25: from F:/Ruby27-x64/lib/ruby/2.7.0/irb/ruby-lex.rb:134:in `each_top_level_statement'
        24: from F:/Ruby27-x64/lib/ruby/2.7.0/irb/ruby-lex.rb:134:in `catch'
        23: from F:/Ruby27-x64/lib/ruby/2.7.0/irb/ruby-lex.rb:135:in `block in each_top_level_statement'
        22: from F:/Ruby27-x64/lib/ruby/2.7.0/irb/ruby-lex.rb:135:in `loop'
        21: from F:/Ruby27-x64/lib/ruby/2.7.0/irb/ruby-lex.rb:138:in `block (2 levels) in each_top_level_statement'
        20: from F:/Ruby27-x64/lib/ruby/2.7.0/irb/ruby-lex.rb:166:in `lex'
        19: from F:/Ruby27-x64/lib/ruby/2.7.0/irb.rb:517:in `block in eval_input'
        18: from F:/Ruby27-x64/lib/ruby/2.7.0/irb.rb:695:in `signal_status'
        17: from F:/Ruby27-x64/lib/ruby/2.7.0/irb.rb:518:in `block (2 levels) in eval_input'
        16: from F:/Ruby27-x64/lib/ruby/2.7.0/irb/input-method.rb:262:in `gets'
        15: from F:/Ruby27-x64/lib/ruby/2.7.0/forwardable.rb:235:in `readmultiline'
        14: from F:/Ruby27-x64/lib/ruby/2.7.0/forwardable.rb:235:in `readmultiline'
        13: from F:/Ruby27-x64/lib/ruby/2.7.0/reline.rb:174:in `readmultiline'
        12: from F:/Ruby27-x64/lib/ruby/2.7.0/reline.rb:236:in `inner_readline'
        11: from F:/Ruby27-x64/lib/ruby/2.7.0/reline.rb:236:in `loop'
        10: from F:/Ruby27-x64/lib/ruby/2.7.0/reline.rb:237:in `block in inner_readline'
         9: from F:/Ruby27-x64/lib/ruby/2.7.0/reline.rb:266:in `read_io'
         8: from F:/Ruby27-x64/lib/ruby/2.7.0/reline.rb:266:in `loop'
         7: from F:/Ruby27-x64/lib/ruby/2.7.0/reline.rb:307:in `block in read_io'
         6: from F:/Ruby27-x64/lib/ruby/2.7.0/reline.rb:238:in `block (2 levels) in inner_readline'
         5: from F:/Ruby27-x64/lib/ruby/2.7.0/reline.rb:238:in `each'
         4: from F:/Ruby27-x64/lib/ruby/2.7.0/reline.rb:239:in `block (3 levels) in inner_readline'
         3: from F:/Ruby27-x64/lib/ruby/2.7.0/reline/line_editor.rb:837:in `input_key'
         2: from F:/Ruby27-x64/lib/ruby/2.7.0/reline/line_editor.rb:795:in `normal_char'
         1: from F:/Ruby27-x64/lib/ruby/2.7.0/reline/line_editor.rb:721:in `process_key'
(irb):1:in `method': wrong number of arguments (given 1,expected 0) (ArgumentError)

但是,如果我更改了名称,则该错误已修复

更改名称后,它可以正常运行

after changing name,it ran correctly

我认为此错误的原因是,ruby中的方法名称不能为“方法” 但是我在 Rubymine 2020.2 中尝试过后,它可以正确运行 我很困惑。

在Rubymine

in RubyMine

解决方法

您正在覆盖Object#method方法。覆盖核心的Ruby方法永远不是一个好主意。

尤其是,IRb和Pry在键入时均支持自动完成,它们还支持文档以及许多其他功能。猜猜他们用什么方法来获得可以使用的Method对象?

因此,正在发生的情况是IRb正在调用method(some_method_name)以访问某些方法,但是您已经用不带参数的方法覆盖了Object#method方法。

不要弄混Ruby的核心方法。而且,如果您使用的是IRb,则尤其是不要与IRb所使用的核心方法混淆。