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

Ruby 为什么我的方法预定义了参数`(num=nil)`?,ruby,Ruby,请解释第1行num=nil的用途。我试图复制可枚举模块,但被count方法吓了一跳 如果查看文档,您会注意到可以不带参数、带参数或带块调用count 代码中的3 if条件反映了调用该方法的这3种不同方式 之所以使用num=nil,是为了提供在调用count时省略num参数的功能。在没有为num指定显式值的情况下,它默认为nil,如果条件num.nil?在Ruby中定义一个方法,它将落入第二个条件,您可以使它具有参数。调用该方法时,参数将替换为您选择的对象。在方法定义中定义参数时,它将成为默认值

请解释第1行num=nil的用途。我试图复制可枚举模块,但被count方法吓了一跳

如果查看文档,您会注意到可以不带参数、带参数或带块调用count

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


之所以使用num=nil,是为了提供在调用count时省略num参数的功能。在没有为num指定显式值的情况下,它默认为nil,如果条件num.nil?

在Ruby中定义一个方法,它将落入第二个条件,您可以使它具有参数。调用该方法时,参数将替换为您选择的对象。在方法定义中定义参数时,它将成为默认值

例如,如果您只是在程序中调用my_count,它会自动选择num为nil,因为没有显式提供参数。否则,如果调用my_count5,则方法中的num将为5

下面是另一个示例,默认值为空哈希。我将创建两个服务器对象:

让我们更改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个参数,即名称。由于文件不再具有默认值,因此不包含参数将引发错误。为了澄清,仅当方法定义具有参数的默认值时,才允许省略参数。如果没有默认值,将不使用任何内容(非nil、0或),程序将停止/崩溃-已引发/遇到错误

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

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

这是参数的默认值。在尝试复制enumerable之前,您可能应该了解更多ruby基础知识。一本好书将提供更好的学习体验。谢谢你的建议,但我目前正在学习Ruby课程,这是其中一个练习。除非我们知道my_是什么,否则我们无法判断。你是在写关于your each还是my_each的文章吗?我阅读了文档,最初对这三个选项感到困惑。如果提供了一个区块,收益部分就会生效——一块蛋糕。如果不提供集团,它。。。直接开始枚举返回true的元素?第三个例子是什么,一个论点?我会把什么样的论点传给伯爵?我决不能老是想着方法是如何接受参数的。我将blocks-procs和lambdas视为我来自JavaScript的Ruby世界的参数。实际上,您必须指定是否不存在任何参数,因为在原始count源代码中,它使用与JavaScript相反的参数进行初始化,在JavaScript中它会自动执行此nil赋值?我说的对吗?不完全正确。有时方法不需要参数。以弦长为例。它不接受参数-它被称为“某个字符串”。长度和长度是从那里计算出来的。它是一个实例方法。现在,由于您正在设计我的_计数来接受一个参数,您是这样说的:如果我只调用我的_计数,那么num将是nil。否则,如果我提供5,num将是5。我基本上是在说我在上面所做的。再次查看服务器示例,并注意错误消息,它位于段落中,而不是在其自身的块中,通过指示默认参数状态num=nil I am暗示指定此方法可以接受参数。非常感谢你让我回到现实中来,虽然这对我来说很尴尬。事实上,这种方法总是需要争论。。。如果您没有显式地选择像my_count5这样的参数,那么它将为方法提供nil,如下所示:my_countnil。
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)
string = 'Hello, world!'
string.length
# => 13