0

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

def method_name(arguments)
  #stuff to be executed
end

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

x = something()

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

4

3 回答 3

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
于 2013-09-16T15:57:03.483 回答
1

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

这个简短的程序演示。参数检查的工作方式是

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

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

  • 如果任何实际参数仍然存在,那么它们将被分配给所有默认参数,从第一个到最后一个。

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

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

该程序演示了其中一些情况。注释行会引发所描述的错误。

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])
于 2013-09-16T16:59:40.000 回答
0

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

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

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

于 2013-09-16T15:47:11.367 回答