【问题标题】:Can someone explain empty parameters in Ruby?有人可以解释 Ruby 中的空参数吗?
【发布时间】:2013-09-20 20:13:31
【问题描述】:

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

def method_name(arguments)
  #stuff to be executed
end

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

x = something()

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

【问题讨论】:

  • 什么是变量?什么空白部分?
  • method_name != something ???
  • 在 Ruby 中,something 可以是变量或方法。 Ruby 确定它是哪个。 something() 强制将其作为方法查找。
  • 大多数时候,括号是可选的。一个值得注意的例外是 supersuper()

标签: ruby variables parameters parameter-passing


【解决方案1】:

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

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

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

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

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

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

  • 如果任何实际参数仍然仍然存在,并且没有定义 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】:

    想象一下你有一个变量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
    

    【讨论】:

    • 看到像something() 这样的方法来躲避变量引用真的很不正常。更常见的是self.something 是明确的。不过,您是对的,这确实会强制进行方法调用。通常,使用相同名称的方法和变量是一个坏主意,因此最好通过不同的名称来避免这种情况。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 2010-12-13
      • 1970-01-01
      相关资源
      最近更新 更多