人的健忘症有时候发作起来,真是天可怜见。在 Ruby 中的方法 ( method ) 参数浅谈 ( 上 ) 我们介绍了 Ruby 方法参数的一些情况。包括不带参数的方法、带参数的方法、带参数具有默认值的方法、参数长度可变的方法等等。
但,我们还是漏讲了 「 关键字参数 」 和 「 块即是参数 」两个重要的概念。
关键字参数 ( keyword arguments )
「 关键字参数 」 是 「 位置参数 」 的替代方法。它们非常类似于将哈希 ( hash ) 传递给方法,但具有更明确的错误
为了理解这个 关键字参数,我们使用一个示例来演示下
def method_with_keyword_arguments(foo: 'bar') "foo is #{foo}" end irb> method_with_keyword_arguments foo: 'naughty' => "foo is naughty" irb> method_with_keyword_arguments => "foo is bar"
上面的代码中,调用 method_with_keyword_arguments
方法需要传递关键字参数 foo
,否则,如果不传递的话,就会使用默认值 'bar'
。
因为定义了默认值,所以也可以不传递 foo
,下面的代码,我们去掉了默认值
def method_with_required_ka(foo:) "foo is #{foo}" end irb> method_with_required_ka foo: 'naughty' => "foo is naughty" irb> method_with_required_ka ArgumentError (missing keyword: foo)
因为去掉了默认值,所以 foo
参数变成了必传的。否则会抛出一个异常 ArgumentError
块即是参数
如果我们定义方法时给参数前面添加符号 &
,那么该参数就可以接受一个 块 作为实参。
Ruby 会自动把块的内容存储在 Proc
的实例中,并将该实例传递给以 &
为前缀的参数
def method_with_block &blk p blk.class blk.call end irb> method_with_block { puts 'a block' } Proc a block => nil
上面的代码中,我们可以看到 blk
是 Proc
的一个实例,调用 blk.call
就和调用 yield
是一样的。
目前尚无回复