繁体   English   中英

通过 :test 导致 ArgumentError: 参数数量错误(给定 0,预期为 2..3)

[英]Passing :test caused ArgumentError: wrong number of arguments (given 0, expected 2..3)

这两个工作:

Rails.application.credentials.development
Rails.application.credentials.send(:development)

但是,第一个.test有效,但 (:test) 无效。

Rails.application.credentials.test
Rails.application.credentials.send(:test)

为什么 :test 很特别? 什么会使这不起作用? 我得到

[5] pry(#<Cred>)>Rails.application.credentials.send(:test)
ArgumentError: wrong number of arguments (given 0, expected 2..3)
from (pry):5:in `test'

testKernel模块中定义的私有方法。 Kernel包含在每个 ruby​​ 对象中。 当您调用.send(:test)会调用此方法,它需要 2 或 3 个参数。

它也可以复制到其他物体上:

[15] pry(main)> :a.send(:test)
ArgumentError: wrong number of arguments (given 0, expected 2..3)
from (pry):23:in `test'
[16] pry(main)> 1.send(:test)
ArgumentError: wrong number of arguments (given 0, expected 2..3)
from (pry):24:in `test'

编辑

我不确定什么对象是credentials ,所以我不能肯定是这种情况,但是当您定义method_missing它会在直接调用私有方法之前调用,但不是使用send调用,见下文:

class B
   def method_missing(*args)
     puts args
   end
end

pry> B.new.send(:test)
ArgumentError: wrong number of arguments (given 0, expected 2..3)
from (pry):32:in `test'

pry> B.new.test
test
=> nil

编辑2:

通常比#send #public_send更安全。 它不会让您调用私有方法,并且它会被#method_missing捕获:

[28] pry(main)> B.new.public_send(:test)
test
=> nil

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM