考虑以下Ruby代码:
def f1(p1, p2: nil, p3: nil)
puts "Parameter 1: #{p1}"
puts "Parameter 2: #{p2}"
puts "Parameter 3: #{p3}"
end
def f2(p1, p2: nil, p3: nil)
f1(p1, p2, p3)
end
# This will throw error ArgumentError: wrong number of arguments (3 for 1)
f2("Hi")
在上面的代码中,我的问题是我需要列出f1和f2中的参数(用户需求)。同时我应该为用户启用命名参数(因为3个参数可以成为30个参数,其中大多数都具有默认值)
有没有人遇到过这个问题?
答案 0 :(得分:4)
您使用了命名参数,您必须明确指定它们。
...
def f2(p1, p2: nil, p3: nil)
f1(p1, p2: p2, p3: p3) # specify p2 and p3
end
f2("Hi")
当您致电f1
时,如果要进行定义,则必须明确指定p2
和p3
查看official documentation或某些third-party resources关于此
的信息def foo(arg1 = 1, arg2:, arg3: nil)
puts "#{arg1} #{arg2} #{arg3}"
end
foo(arg2: 'arg2')
# Will display
# 1 arg2
foo('arg1_defined', arg2: 'arg2')
# WIll display
# arg1_defined arg2
注意:同样命名的参数不必遵循顺序,您可以按照您想要的任何顺序放置它们,但是在其他参数之后
foo(arg3: 'arg3_with_value', arg2: 'arg2_val')
# 1 arg2_val arg3_with_value
foo(arg3: 'arg3_val', 10)
# SyntaxError: unexpected ')', expecting =>
# they have to be after not-named arguments