其实吧,我觉得这个主题 「 Ruby 中的方法 ( method ) 参数 」没啥好讲的。不就是 「 不带参数的方法 」、「 带参数的方法 」、「 带具有默认值参数的方法 」、「 参数数量可变的方法 」几大类么 ?
后面想了想,其实作为 Ruby 基础教程: Ruby 方法 的补充,多学习学习,记忆就会更深刻一点。
不带参数的方法
Ruby 中的方法可以没有参数,这些无参数方法在调用的时候也不必传递任何参数
def method_without_arg() "without arg" end def method_without_arg_and_parentheses "without arg & parentheses" end irb> method_without_arg => "without arg" irb> method_without_arg() => "without arg" irb> method_without_arg_and_parentheses => "without arg & parentheses" irb> method_without_arg_and_parentheses() => "without arg & parentheses"
上面的代码中,我们既没有为方法 method_without_arg
和 method_without_arg_and_parentheses
定义任何形参,在调用它们的时候也没有传递任何实参
「 形参 」 就是在定义方法时定义的参数列表
「 实参 」 就是在调用方法时给形参传递的实际值
通常,Ruby 程序员更喜欢没有括号 ( 没有参数 ) 的方法。因为,这种无参数方法实际上更 「 适用 」于 Ruby 中的消息处理机制
带参数的方法
从另一方面说,Ruby 也允许在定义方法时添加参数列表,和在调用方法时传递实际的值。
def method_with_args arg1 "with args: #{arg1}" end def method_with_args_and_parentheses(arg1) "with args & parentheses: #{arg1}" end irb> method_with_args 'an argument' => "with args: an argument" irb> method_with_args('an argument') => "with args: an argument" irb> method_with_args_and_parentheses 'an argument' => "with args & parentheses: an argument" irb> method_with_args_and_parentheses('an argument') => "with args & parentheses: an argument"
从上面的代码中可以看到,定义带参数的方法,可以使用小括号 ()
,也可以不实用小括号,调用带参数的方法传递实际的值的时候也一样,可以使用小括号,也可以不使用小括号。
当不使用小括号的时候,则必须在 「 方法名 」 和第一个参数之间添加一个 「 空格 」
带具有默认值参数的方法
当我们定义带参数的方法时,可以给参数指定一个默认值,这样,但调用该方法时如果没有传递相应的参数,Ruby 就会使用定义的默认值。
def method_with_default_value(newsletter = 'ruby.devscoop.fr') "The Ruby newsletter is #{newsletter}" end irb> method_with_default_value 'awesome' => "The Ruby newsletter is awesome" irb> method_with_default_value => "The Ruby newsletter is ruby.devscoop.fr"
上面的代码中,当调用 method_with_default_value
方法且没有为参数 newsletter
传递任何值时,就会使用我们定义的默认值 ruby.devscoop.fr
,否则就会使用我们传递的值。
可变长度的参数列表的方法
Ruby 支持支持可变长度的参数列表
「 可变长度的参数列表 」的意思是: 在定义方法时并不能明确该方法被调用时会传递多少个参数。
这种情况下,我们会在最末尾的参数前加一个星号 *
,表示该参数接受未定数量的其它实参
def method_with_varargs *names puts names.class, "\n" names.each {|name| puts name} end irb> method_with_varargs 'Mehdi', 'John', 'Sam' Array Mehdi John Sam
调用时,如果传递的参数多余指定的参数,那么剩余的那些参数都会和前一个参数一起保存到 *
号开头的形参中。