请解释第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
答案 0 :(得分:1)
如果您查看Enumerable#count
文档,您会注意到您可以在没有参数,带参数或块的情况下调用count。
代码中的3个if条件反映了调用该方法的这3种不同方式。
您(num = nil)
的原因是,在调用num
时,可以省略count
参数。在没有给出num
的明确值时,它默认为nil
(它将落入第二个if条件num.nil?
)。
答案 1 :(得分:0)
无论何时在Ruby中定义方法,都可以使其具有参数。调用该方法时,参数将被您选择的对象替换。在方法定义中定义参数时,它将成为默认值。
例如,如果您只是在程序中调用my_count
,它会自动选择num
为nil
,因为没有明确提供任何参数。否则,如果您拨打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
不再具有默认值,因此不包括参数会引发错误。为了澄清,只有在方法定义具有参数的默认值时才允许省略参数。如果没有默认值,则不会使用任何内容(不是nil
,0
或''
),程序将停止/崩溃 - 引发/遇到错误。
可以创建不带参数的方法。以下是使用String#length
的示例。您将看到.length
不接受参数,而是对字符串起作用。
string = 'Hello, world!'
string.length
# => 13