Peanut's Book Shelf » 日志 » Why Ruby amazes me? PRuby Chap 6 方法调用
Why Ruby amazes me? PRuby Chap 6 方法调用
Gem Gatherer 发表于 2008-05-02 17:01:19
用def可以定义一个方法,方法必须以一个小写字母开头
** 如果使用大写字母,不会出错,但是Ruby会优先猜测这是一个常量而不是一个方法调用,解析可能出错
指定形参默认值
def cool_dude(arg1="Miles", arg2="Coltrane", arg3="Roach")
"#{arg1}..."
end
** 不能在方法体内定义非单件类或模块
** 可以嵌套定义方法,但此方法只有在外部方法执行的时候才得到定义
** 方法的返回值是执行的最后一个表达式的值,或者return显式返回的值
可变参数列表
def varargs(arg1, *rest)
...
end
这样,第一个参数赋值给arg1,其它剩余的参数都会被装入到一个新的Array中,然后赋值给第二个参数
** 它还有个有趣的逆操作:)
def five(a,b,c,d,e)
end
<-- five(1,2,3,*['a','b'])
<-- five( *(10..14).to_a)
看见了么?可以传递一个前面加*的数组,这样,数组元素就会自动被视为单独的参数。
方法和block
调用一个方法时,可以提供一个block与其关联,在方法内可以用yield调用这个block
** 如果方法定义的最后一个参数前缀是&,那么所关联的block会被转换为一个Proc对象,然后赋值给这个参数
def initialize(name,&block)
@name, @block=name, block
end
def get_tax(amount)
"Tax = #{@block.call(amount)} " # 这样便于传递代码片段对象。。。很方便不是么:)
end
调用方法
** 如果没有二义性,在调用方法时,可以省略参数列表两侧的括号。
** 如果在方法名和左括号之间有空格,将得到一个警告
返回值
Ruby可以轻易的返回多个值.
def meth
return 1,2
end
<-- meth
--> [1, 2]
更加动态的block : 让lambda来辅助block!
if d > 0
calc = lambda {|n| n*number}
else
calc = lambda {|n| n+number}
<-- puts((1..10).collect(&calc).join(", "))
在实参里加&的参数是代表什么?Ruby将认为它是一个Proc对象,会将其从参数列表中删除,并将Proc对象转化为一个block,然后关联到该方法
散列参数
当我们要传送动态创建的散列表作为参数时,我们可以不用一般创建散列表的方式(那样容易和block混起来)...
list.create_search('short jazz songs',
'genre' => 'jazz',
'duration_less_than' => 270)
当然,这样要散列表是形参表的最后一个才能有效。
** 上面的调用还有一个形式
list.create_search('short jazz songs',
:genre => :jazz,
:duration_less_than => 270)
