Passing :test caused ArgumentError: wrong number of arguments (given 0, expected 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'
test
是Kernel
模块中定义的私有方法。 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
这两个都有效:
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'
test
是Kernel
模块中定义的私有方法。 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