带有命名参数的Ruby Argument Error

时间:2018-02-02 08:54:22

标签: ruby-on-rails ruby

考虑以下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个参数,其中大多数都具有默认值)

有没有人遇到过这个问题?

1 个答案:

答案 0 :(得分:4)

您使用了命名参数,您必须明确指定它们。

...
def f2(p1, p2: nil, p3: nil)
  f1(p1, p2: p2, p3: p3)   # specify p2 and p3
end

f2("Hi")

当您致电f1时,如果要进行定义,则必须明确指定p2p3

查看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