为什么我的方法预定义参数`(num = nil)`?

时间:2015-08-21 17:42:28

标签: ruby

请解释第1行(num=nil)的目的是什么。我试图复制Enumerable模块,并被#count方法吓到了。

def my_count(num = nil)
   c = 0
   if block_given?
     my_each { |i| c += 1 if yield(i) }
   elsif num.nil?
     c = length
   else
     my_each { |i| c += 1 if i == num }
   end
   c
 end

2 个答案:

答案 0 :(得分:1)

如果您查看Enumerable#count文档,您会注意到您可以在没有参数,带参数或块的情况下调用count。

代码中的3个if条件反映了调用该方法的这3种不同方式。

(num = nil)的原因是,在调用num时,可以省略count参数。在没有给出num的明确值时,它默认为nil(它将落入第二个if条件num.nil?)。

答案 1 :(得分:0)

无论何时在Ruby中定义方法,都可以使其具有参数。调用该方法时,参数将被您选择的对象替换。在方法定义中定义参数时,它将成为默认值。

例如,如果您只是在程序中调用my_count,它会自动选择numnil,因为没有明确提供任何参数。否则,如果您拨打my_count(5),则方法中的num将为5。

这是另一个示例,默认值为空哈希。我将创建两个Server个对象:

class Server
  attr_accessor :name
  attr_accessor :files

  def initialize(name, files={})
    @name = name
    @files = files
  end
end

# Supply hash of files
Server.new('hostname', {'filename' => '2015-08-21 13:49 -4000'})

# New server will have no files -- empty hash
Server.new('hostname')

让我们更改initialize方法并创建最后一个服务器:

class Server
  attr_accessor :name
  attr_accessor :files

  def initialize(name, files)  # No default value for files
    @name = name
    @files = files
  end
end

Server.new('hostname', 'path/to/files/')
# => ArgumentError: wrong number of arguments (1 for 2)

在修改后的类中,我只提供了1个参数,即名称。由于files不再具有默认值,因此不包括参数会引发错误。为了澄清,只有在方法定义具有参数的默认值时才允许省略参数。如果没有默认值,则不会使用任何内容(不是nil0''),程序将停止/崩溃 - 引发/遇到错误。

可以创建不带参数的方法。以下是使用String#length的示例。您将看到.length不接受参数,而是对字符串起作用。

string = 'Hello, world!'
string.length
# => 13