有人能解释Ruby中的空参数吗?

时间:2013-09-16 15:42:57

标签: ruby variables parameters parameter-passing

每次我看到空参数时,它都出现在这样的方法中:

def method_name(arguments)
  #stuff to be executed
end

然后调用一个方法。现在我遇到了这个:

x = something()

我在看什么?我知道它是一个变量,但空白部分是什么?

3 个答案:

答案 0 :(得分:3)

想象一下你有一个变量something和一个方法something的情况。每当你提到something()时,你指的是方法。

def something
  "Java"
end

something = "Ruby"

a = something #=> value of a is "Ruby"
a = something() #=> value of a is "Java" # got from method

答案 1 :(得分:1)

Ruby方法参数非常灵活。根据方法定义,调用中给出的参数可以直接传递,如果不存在则默认,或者压缩为单个数组参数。

这个简短的节目演示了。参数检查的工作方式是

  • 调用中提供的参数首先分配给方法定义中从第一个到最后一个的所有单个非默认参数。

  • 如果实际参数不足以匹配所有非默认形式参数,则会引发wrong number of arguments (N for M) (ArgumentError)

  • 如果仍然存在任何实际参数,那么它们将从头到尾分配给所有默认参数。

  • 如果任何实际参数仍然,那么它们将被捆绑到一个数组中并分配给 splat 参数(如果已定义)。

  • 如果仍然存在任何 的实际参数,并且未定义任何splat参数,则会引发wrong number of arguments (N for M) (ArgumentError)

该计划展示了其中一些情况。注释行会引起所描述的错误。

def method_name(arguments)
  puts "method_name(#{arguments})"
end

def something()
  puts 'something()'
end

def something_else(param = 99)
  puts "something_else(#{param})"
end

def something_more(param = 99, *rest)
  puts "something_else(#{param}, #{rest})"
end

#method_name()
method_name(1)

#something(1)
something()

something_else()
something_else(42)

something_more()
something_more(1)
something_more(1, 2)

<强>输出

method_name(1)
something()
something_else(99)
something_else(42)
something_more(99, [])
something_more(1, [])
something_more(1, [2])

答案 2 :(得分:0)

在ruby中,括号是可选的,因此在您的示例中,调用method_name相当于调用method_name(),但是您的方法需要参数。也许这会更好地说明它:

def method_name(arguments={})
  #do stuff
end

此方法具有散列的可选参数。您可以使用以下任意一种方式调用此方法:method_namemethod_name()method_name(argument1: "something")